引言
在我们的开发中,也许有些项目会有换肤的需求,这个时候会比较头疼怎么做才能做到一键换肤呢?大家肯定希望越简单越好。下面我们基于Github上比较受欢迎的Android-Skin-Loader框架分析一下换肤的本质是什么?
原理
换肤,其本质无非就是更换页面元素(view或viewGroup)的属性值,这些属性值都是可以用资源文件表示的,换句话说换肤其实就是替换掉资源文件。比如换个背景,换个文字颜色等。
先看一组换肤:
分析上面的平板应用换肤其中的一个页面,绿色和蓝色风格只有背景图片、控件颜色改变了。
再看一张控制流程图了解大概思路:
上图大致讲解了换肤的原理,即通过对页面下的所有view重新设置一遍资源文件,而这些资源文件我们可以把它制作成皮肤包(即apk)。
也许通过上面这张流程图你还是不能完全看懂每一个工作流程,下面配合代码详细介绍一下:
-
遍历页面下所有元素及其属性集合
通过在页面(Activity、FragmentActivity)中设置Factory,该Factory能拿到页面下所有view和attrsActivity / FragmentActivity
/** * SkinInflaterFactory是自定义的Factory,实现了android.view.LayoutInflater.Factory * 创建view的事情委托给自定义工厂 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SkinInflaterFactory mSkinInflaterFactory = new SkinInflaterFactory(); getLayoutInflater().setFactory(mSkinInflaterFactory); }
SkinInflaterFactory
/** * SkinInflaterFactory在onCreateView()方法完成了view的创建 * 我们可以在该方法中获取view和view的属性集AttributeSet * * @param name view的类名全称 例如:1.android.widget.TextView 2.android.view.View等 * @param context 上下文 * @param attrs xml中该view的属性 */ @Override public View onCreateView(String name, Context context,