Android进阶之网易云插件化换肤实现方案

  • 换肤的实现思路
  • 换肤的实现流程
  • 解析使用皮肤插件包

前言

大概是在2016年接触换肤功能,那时候接触的换肤方案实现起来比较繁琐,性能比较低。通过发送通知动态设置资源文件,图片,文字颜色等相关属性。随着技术的不断发展,越来越多的高性能换肤方案涌现出来,今天为大家详细介绍一种高性能,低侵入性的插件化换肤方案。

目的

实现网易云换肤功能

实现思路

换肤的流程主要是利用系统解析xml文件中的View,收集到View的名称,属性等相关信息后,通过拦截系统创建View,自己实现View的创建过程。动态加载需要替换的皮肤资源,如Color,Drawable,Background等相关属性资源,实现App换肤功能。

换肤流程

  1. 分析系统加载XML布局流程,找到View创建拦截入口。

系统创建View示意图:

首先在Activity中使用setContentView设置显示布局的ID。

在setContentView中调用LayoutInflater的inflate方法解析布局中的View,获得相关属性。并在inflate中调用createViewFromTag创建xml中需要显示的View。

createViewFromTag将View的名称,属性等信息传给tryCreateView将View创建出来。如果返回的view为null,则调用onCreateView或createView方法创建View。不为null,则直接返回view。

在tryCreateView方法中,先判断接口实例mFactory2是否为null,调用onCreateView进行创建。Factory2是接口,默认为null,需要我们自己实现,将系统中View创建的流程拦截下来。

  1. 定义SkinFactory类实现Factory2接口,实现onCreateView方法,模拟系统创建View。

  1. 收集保存View相关属性,在onCreateView中调用SkinAttrbuteSet的lookAttributeSet方法进行属性收集。

  1. 遍历属性集合,筛选出需要换肤的属性。这里简单列举几个常用的属性。如background,src,textcolor,drawable等。

加载皮肤插件包

Android系统加载资源文件主要有两种方式,Resource和AssetManager。Resources 类也是通过 AssetManager 类来访问那些被编译过的应用程序资源文件的,不过在访问之前,它会先根据资源 ID 查找得到对应的资源文件名。 而 AssetManager 对象既可以通过文件名访问那些被编译过的,也可以访问没有被编译过的应用程序资源文件。

资源加载示意图:

  1. 下面一共制作了四个资源名称相同,颜色不同的皮肤包。

  1. 加载皮肤插件包中的资源文件。

我们都知道在Android中有两种加载资源文件的方式分别是AssetManager和Resource。但是Resource最终也是调用了AssetManager进行资源加载(请大家自行阅读源码),App中的AssetManager主要用来加载项目中的资源文件,但是皮肤包中的资源文件怎么加载呢?由于皮肤包的资源名称和系统中的是完全一样,用系统的AssetManager加载皮肤包的资源会报错。这时需要我们通过Hook技术,创建一个Assetmanager 专门加载皮肤包的资源。

  1. 最后看实现效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值