Android-高级 UI-02- 换肤

110 阅读1分钟
  • 换肤内容:资源文件、图片、字体、文字颜色、等等

  • 换肤思路

  1. 知道xml的View 怎么解析的?? ---》
  2. 如何拦截系统的创建流程? setFactory2 可以拦截 --- aop的思路去实现
  3. 拦截后怎么做?? 重写系统的创建过程的代码(复制)
  4. 收集View以及属性 每个Activity的View 及属性都需要收集
  5. 创建皮肤包 -- apk
  6. 如何使用??只用插件的res(插件的 java、res)
    1. 系统的资源是如何加载的? Resources、Assetmanager
    2. 通过Hook技术,创建一个Assetmanager 专门加载皮肤包的资源
    3. 通过 反射 addAssetPath 方法放入皮肤包的路径 从而得到 加载皮肤包资源的 Assetmanager
    4. 首先通过 app的资源id --》 找到 app的资源name --》 皮肤包的资源id
  • 技术要点: 观察者模式、aop、Hook技术

换肤流程

image.png

布局创建流程

如何从一个XML创建出对应的View对象,完成布局加载?

  • 1、根据资源ID获得XML数据,进行XML解析
  • 2、根据XML解析的节点(View的名称)创建对象
  • 3、解析节点中的属性设置对象属性

image.png

系统实例化 view 流程

image.png

系统能获得每一个View对象,我们如何获得?

image.png

image.png

image.png

image.png

换肤

image.png

资源加载

image.png

image.png

image.png

image.png

实际上,Resources 类也是通过 AssetManager 类来访问那些被编译过的应用程序资源文件的,不过在访问之前,它会先根据资源 ID 查找得到对应的资源文件名。 而 AssetManager 对象既可以通过文件名访问那些被编译过的,也可以访问没有被编译过的应用程序资源文件。

资源管理

image.png

时序图

image.png