【Android】自定义换肤框架04之Skinner框架设计

时间:2024-07-07 20:15:56

到上一章为止,我们已经完整讲解了换肤所用到的所有技术点

这一章,我们来梳理下,如何从整体和细节上,进行代码设计

毕竟,我们不止是简单实现功能,要做到功能清晰,使用灵活

文章目录

          • 核心组件
          • 使用约定
          • 关于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

本期到此为止,下一章我们给出最终教程和源码