个人记录-换肤

如何收集View?
利用Factory2,接管View的实例化流程,内部使用反射进行创建,并记录View的属性。

什么时候收集View?
onCreate 方法中,添加自定义创建View工厂,运行setContentView之后会将运行自定义View工厂进行view的实例化和记录。

如何记录View的属性?
遍历AttributeSet中获取属性,如果遍历的属性为设定好需要换肤的属性,获取对应属性值进行判断。如果#开头为写死,不需要;如果是?或者@开头则获取属性ID值。

插件APK包如何生成?
debug包即可,只有res资源文件。

如何加载插件Apk包资源?
反射调用AssetManager中的addAssetPath ,传入apk包路径,然后调用Resources获取插件包资源,记录路径包地址。

如何记录是否换肤?
SharedPreferences记录,加载插件包后修改为已加载,加载原资源修改为未加载。

如何修改属性?
获取本地资源和插件包资源,获取每个View和已记录的属性名,判断当前是否加载插件包资源来加载对应资源。

自定义View怎么自定义换肤?
自定义View继承一个接口,一键换肤时候判断控件 instanceof,然后调用接口方法,方法再自定义View中实现,并

谁通知谁换肤?如何做到?
换肤管理者【】通知换肤工厂进行换肤,换肤工厂【Observer】通知View进行换肤。
观察者模式。

最大支持SDK版本到(28)


最大支持.png

需要用到什么类?
1、 记录状态值的类【SkinPreference】
2、 记录View和属性值的类【SkinAttribute】
3、 保存类和属性值的类【SkinView、SkinPair】
4、 继承Factory2,创建View的类【SkinLayoutInflaterFactory】
5、 生命周期类,用于加载某界面时候进行view记录的类【SkinActivityLifecycle】
6、 管理换肤功能和状态值的类【SkinManager】
7、 自定义View用于换肤的接口【SkinViewSupport】
8、 获取资源内容的类【SkinResources】
9、 状态栏变化的类【SkinThemeUtils】

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容