插件式换肤流程:
一:采集需要换肤的控件
- SkinLayoutInflaterFactory
- onCreateView() --创建对应布局并返回
* skinAttribute.load(view, attrs);--加载哪些控件属性需要被更改
- onCreateView() --创建对应布局并返回
//页面属性管理器
- SkinAttribute
- load()方法加载并保存哪些控件属性需要修改
- SkinPair(attributeName, resId)--一个javaBean保存需要修改的属性名,已经属性名对应的value(Int类型)值
- SkinView(view, mSkinPars)--一个javaBean,保存对应的view,以及View对应的属性(SkinPair对象)的集合。
- applySkin(Typeface typeface)--循环遍历装有属性(SkinPair对象)的集合,根据属性对象对应的属性值更改对应的value
二:加载皮肤包
-
SkinManager
-
SkinManager(Application application) --管理类的构造
//共享首选项 用于记录当前使用的皮肤
** SkinPreference.init(application);
//资源管理类 用于从 app/皮肤 中加载资源
** SkinResources.init(application);
//注册Activity生命周期
** skinActivityLifecycle = new SkinActivityLifecycle();
application.registerActivityLifecycleCallbacks(skinActivityLifecycle);//加载皮肤
** loadSkin(SkinPreference.getInstance().getSkin());
** 加在文件的两种方式
* 以文件名的方式(apk文件)
* ResoureceID 方式
* 通过以上两种方式拿到文件名,使用AssetManager 加载皮肤资源 -
loadSkin(String skinPath) --通过皮肤路径加在皮肤包 如果为空则使用默认皮肤
//通知采集的View 更新皮肤
//被观察者改变 通知所有观察者
** setChanged();
** notifyObservers(null);
-
-
SkinResources 资源管理类 用于从 app/皮肤 中加载资源
三:更新所有可能被换肤的控件
- SkinLayoutInflaterFactory
** update(Observable o, Object arg)添加观察者--更换皮肤
** skinAttribute.applySkin();
四:状态栏、导航栏的换肤
SkinThemeUtils
*updateStatusBarColor(Activity activity) --修改状态栏的颜色
网友评论