一键换肤--动态更换主题颜色风格

6,289 阅读3分钟
原文链接: www.jianshu.com

基于前一段时间项目具有换肤需求的功能,几经预研学习换肤功能效果,网上的资源很多,最初看到是网易换肤的酷炫效果,今天得空打算写一篇关于换肤功能的文章,项目无需重启Activity的就可以实现无缝换肤切换功能,可高仿网易云音乐的主题换肤效果。

本文介绍的换肤效果是通过依赖library来设置tag来实现更换主题效果的,可通过项目,library所使用的机制是通过根据每个view中所设置的tag标签在执行recreate()方法的时候来匹配不同的tag展示所需要的效果,在DefaultProcessor类中定义了许多不同状态下的tag标签,如图:


项目中可以对控件文字动态更改颜色,可在继承View和ViewGroup对应的子类的布局文件中例如TextView通过设置android:tag="text_primary_color"和RelativeLayout中设置android:tag="bg_primary_color"来添加相关tag的关联,如图:


在本文DynamicSkin中,提供了多种不同主题背景颜色的选择,而且还实现了仿照网易音乐的滑动颜色条,通过自定义不同颜色带分布的滑动条ColorPickerView,用来实现多种颜色不满足需求的情况下的自取颜色的主题风格,该ColorPickerView中的颜色带是通过LinearGradient类来绘制在不同区间以镜像方式平铺展示不同颜色的一个渐变效果,如图:


项目中也可以动态对图片进行更改颜色,对于图片颜色的动态改变,需要注意的是需要图片所要改变的地方做成镂空图(可查看项目中图片效果DynamicSkin),这样通过设置动态背景来实现图片换肤功能,在选取合适的颜色时将颜色存储到SharedPreferences中(如下图),然后可以设置tag为bg_primary_color,也可以通过在代码中设置imageView.setBackground(newColorDrawable(Config.getPrimaryColor() ==0? getResources().getColor(R.color.global_color) : Config.getPrimaryColor()));


需要注意的是继承Application的Myapp中getATEKey()方法往SharedPreferences中存储哪种模式下的换肤状态(此处可优化,不加会报错)模式,还需注意的是关于多套图片和完全不同的布局文件资源的换肤,可以通过插件的形式加载需要换肤的apk资源包,网上关于这类教程也有很多,之前也预研了解过,但是没在项目中实现,需要学习,可以在网上搜索查看。

在此项目中可了解到:

1.自定义的通用标题栏,可用于整个项目,便于管理。

2.项目结构分层,实现类基于base模块,简化的base模块用于整个项目生命周期等管理,便于简化代码结构。

3.整体项目动态更换主题,动态变色,原理中关键是通过设置一个tag来进行标记,高仿网易云音乐的主题换肤

4.自定义颜色条控件具体实现

具体功能点请查看项目DynamicSkin,接下来展示具体实现效果图




源码传送:DynamicSkin   欢迎大家Star和Fork,有问题多多讨论,邮箱地址xuancaocom@sina.cn。

参考:项目中library采用的是github上的这个开源项目app-theme-engine-master中依赖的一个library,在此感谢!