到上一章为止,我们已经完整讲解了换肤所用到的所有技术点
这一章,我们来梳理下,如何从整体和细节上,进行代码设计
毕竟,我们不止是简单实现功能,要做到功能清晰,使用灵活
文章目录
- 核心组件
- 使用约定
- 关于SkinnerProvider
- 设计过程中要注意的细节
- End
核心组件
-
SkinnerResources,用于代替默认Resources,根据皮肤和模式加载资源
-
SkinnerInflaterFactory,用于代替默认LayoutInflater创建View
-
SkinnerProvider,用于对已创建的View进行换肤,主要是根据Attribute和Skin设置对应Resource
-
SkinnerProvidersFactory,管理默认SkinnerProvider,和自定义SkinnerProvider
-
SkinnerKit,提供SkinnerSDK对外调用接口,主要是init/install/load
-
SkinnerValues,定义SkinnerValues常量
-
SkinnerCompatActivity,非必须组件
提供createContentView/initContentView/reloadContentView等生命周期方法,方便换肤后重载布局
使用约定
- 支持skin和mode两种属性搭配使用,比如同一种皮肤,有深色模式和浅色模式
- 需要换肤的资源,名称以_skinnable结尾的资源,不符合此条件的资源,意味着不需要跟随换肤变化
- 同一个皮肤需要支持多种模式时,在res下面添加新的以_skinnable_mode的资源即可,框架会根据mode自动切换
- 默认只对background,src,textColor三个最常用的属性进行换肤,其它属性可通过自定义Provider配置
关于SkinnerProvider
- 目前所有换肤框架,均无法做到对所有控件,所有属性,进行自动换肤,这是Android自身技术限制所致
- 不同换肤框架最大的区别就是在于,如何适配所有控件,所有属性
- SkinnerProvider的设计初衷,在于将换肤适配代码,与xml/view/activity完全解耦
- 这样大家不管是集成Skinner框架,还是以后移除Skinner框架,对项目代码都没什么改动
- 自定义SkinnerProvider,请参考
BasicAttributeSkinner#hookView
方法 - 自定义Provider需要通过SkinnerProvidersFactory注册,并且在xml中通过
skin:provider
属性表明使用哪个provider - 多个Provider通过空格隔开即可
设计过程中要注意的细节
- 当皮肤包不存在,资源不存在,或反射被禁用时,要能自动切换到默认的Resource
- 支持在使用过程中换肤,重新调用setContentView后生效
- 支持自动保存和加载上次的皮肤设置
- 如果同一套skin有多个mode的话,最好是新建一个res-mode文件夹来存放资源,方便管理
- provider根据需要来使用,一是提升性能,二是防止多个provider功能有交集
End
本期到此为止,下一章我们给出最终教程和源码