Android动态换肤研究(一)

动态改变View的Color等值

SkinWizard

这个换肤库是在研究了android-skin-loader之后,作为学习笔记做出来的一个换肤库

1、主要思路

通过配置不同的“皮肤”(style)文件,通过加载不同的style文件,为每个需要设置颜色(皮肤)的View设置不同的颜色资源。

2、 style配置
<!-- skin -->
 <style name="Default">
     <item name="android:textColor">#0000FF</item>
     <item name="android:background">@color/colorAccent</item>
 </style>

 <style name="BlackNight">
     <item name="android:textColor">#0FF0F0</item>
     <item name="android:background">#f7f700</item>
 </style>

如下,这样的资源文件可以通过

TypedArray typedArray = context.obtainStyledAttributes(styleResId, skinAttrs);

来获取。

3、使用LayoutInflater获取需要配置颜色的View
public class SkinInflateFactory implements LayoutInflater.Factory {

    private ArrayList<SkinItem> mSkinItems = new ArrayList<>();
    private Context mContext;

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {

        mContext = context;
        // 解析出需要换肤的控件
        boolean skinChangeEnable = attrs.getAttributeBooleanValue(SkinConfig.SKIN_CHANGE_NAMESPACE, SkinConfig.SKIN_ATTRIBUTE_NAME, false);

        if (skinChangeEnable) {
            View view = createView(context, name, attrs);
            parseSkinAttrs(view, attrs);

            return view;
        }
        return null;
    }

onCreate中如果返回null则默认使用android自己的Inflate View的方法。

这里,通过获取需要换肤的View,缓存起来,然后现在需要换肤的时候动态读取配置就行了。

4、缺点
  • 不能配置一些自定义的属性;
  • 无法对不同的View的相同的颜色属性(譬如:TextView)配置出不用的颜色值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容