Android动态换肤框架实现小结
Android动态换肤框架实现小结
动态换肤的优点
-
减少APK体积
-
不需要更新apk就可以更新皮肤
-
可以实时更换皮肤
整体实现流程
-
通过设置LayoutInflector.Factory2来监听View的创建过程,收集需要换肤的View和属性
-
加载皮肤包资源,将其封装成AssetManager和Resources
-
遍历需要换肤的View,通过原属性资源id获取资源名和类型,然后根据资源名和类型从皮肤包的Resources对象中取出最新的皮肤资源,并将新的资源应用到View上
实现细节
-
收集需要换肤的View的过程是怎么样的?
-
在解析xml布局文件时,会先调用LayoutInflactor.Factory2的创建View方法,如果返回null,则会走系统默认创建View方法,所以我们可以在Factory2中判断View是否包含自定义属性,根据自定义属性的值来决定要不要支持皮肤更新;
-
如果不需要则返回null,需要则我们自己创建View,并应用皮肤包里最新的资源
-
收集需要换肤的View时,我们需要保存它设置的属性和对应的值,然后根据属性的资源id,获取到对应的资源类型和资源名称,换肤时,根据资源名和类型去皮肤包对应的Resources对象中获取对应资源并应用到View上面
-
-
如何加载皮肤包资源?
通过反射构建AssetManager对象,并反射调用其
addAssetPath
方法将皮肤包所在路径添加进去,然后通过AssetManager构建新的Resources对象对皮肤包中的资源进行管理