使用SkinManager实现换肤功能

试着用鸿洋大神写的SkinManager实现了换肤功能。

一、配置
在app下build.gradle中添加依赖:

//换肤功能
compile 'com.zhy:changeskin:4.0.2'

这样就配置好了,然后在程序入口进行初始化。

二、全局初始化
在自己创建的继承application的类中添加:

//换肤sdk初始化
SkinManager.getInstance().init(this);

这个类肯定要在清单文件<application/>节点配置的。
接下来还需要注册。

三、注册
在清单文件中添加权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在使用换肤功能的页面onCreate()中注册:

//换肤功能页面注册
SkinManager.getInstance().register(this);

有注册当然有注销啊,在onDestroy方法中取消注册:

//换肤功能注销
SkinManager.getInstance().unregister(this);

四、命名规则
1、SkinManager命名规则是:前缀 + “_” + 后缀;
2、前缀、后缀的命名由开发者自行定义;
3、同属性不同肤色前缀一样,不同属性前缀不一样;

//例如:定义textColor属性值为@color/skin_text,不同肤色color命名前缀均为skin_text

4、后缀根据肤色主题配置,每个主题所有属性后缀一样;

//例如:肤色有黑色、白色两种主题,如果黑白定义为“black”“white”,
//那么不管是textColor还是background属于黑色主题的后缀就是black,属于白色主题的后缀就是white。

五、肤色配置
1、在res/values/colors.xml中配置不同皮肤颜色:

<!--黑底白字(默认主题)-->
<color name="skin_text">#FFFFFF</color>
 
<!--黑底白字(黑色主题)-->
<color name="skin_text_black">#FFFFFF</color>

 <!--白底黑字(白色主题)-->
<color name="skin_text_white">#000000</color>

2、在res/drawable下创建背景shape:
skin_bg.xml(默认主题)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid
        android:color="#000000"/>
</shape>

skin_bg_black.xml(黑色主题)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid
        android:color="#000000"/>
</shape>

skin_bg_white.xml(白色主题)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid
        android:color="#FFFFFF"/>
</shape>

3、在src/drawable下导入不同主题图片:

//图片同样以skin_src.png、skin_src_white.png、skin_src_black.png命名

注意:这三种肤色配置非必须,1常用来配置textColor属性、2常用来配置background属性、3常用来配置src属性,根据项目需要自行设置

六、布局引用
布局中引用直接设置tag属性。
textColor属性设置:

 <TextView
            android:id="@+id/title"
            style="@style/MatchWrap"
            android:layout_marginTop="@dimen/dp_10"
            android:gravity="center_horizontal"
            android:tag="skin:skin_text:textColor"
            android:text="测试文字"
            android:textColor="@color/skin_text"
            android:textSize="@dimen/sp_24" />

background属性设置:

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/skin_bg"
            android:tag="skin:skin_bg:background">

src属性设置:

<ImageView
            style="@style/WrapWrap"
            android:src="@drawable/skin_src"
            android:tag="skin:skin_src:src"/>

注意:使用SkinManager,background属性不支持@color设置,只能设置@drawable/...

七、tag属性
分为三部分:
第一部分skin是固定值,不可改变;
第二部分skin_text、skin_bg、skin_src是肤色配置前缀;
第三部分textColor、background、src是肤色配置对应的属性;
此外,tag属性支持多属性配置,用“|”分割,如:

<TextView
            style="@style/MatchWrap"
            android:layout_marginTop="@dimen/dp_10"
            android:background="@drawable/skin_bg"
            android:gravity="center_horizontal"
            android:onClick="changeClick"
            android:tag="skin:skin_text:textColor|skin:skin_bg:background"
            android:text="测试文字"
            android:textColor="@color/skin_text"
            android:textSize="@dimen/sp_24" />

同时设置了textColor和background属性。

注意:第二部分(skin_text)不必与对应属性值(android:textColor)的命名(@color/skin_text)完全一致,这里是因为我设置的skin_text为默认主题,如果你设置skin_text_default为默认主题,tag配置不变,属性值应为@color/skin_text_default

八、换肤代码
以第七项中的TextView点击事件实现换肤为布局,在页面中:

//声明成员变量,默认false,默认主题为黑色
private boolean isChange;
//实现设置点击事件
public void changeClick(View view){
        Log.e(TAG, "点击改变");
        isChange = !isChange;
        if(isChange){
            SkinManager.getInstance().changeSkin("white");
        }else{
            SkinManager.getInstance().changeSkin("black");
        }
    }

使用changeSkin("后缀")就实现了换肤功能;

如果要在弹窗中添加换肤功能,可以在弹窗布局添加换肤配置后,页面代码中调用SkinManager.getInstance()的injectSkin(View view)方法实现。

final Dialog dialog_skin = new Dialog(activity, R.style.MyDialogTheme);
View contentView = View.inflate(activity, R.layout.dialog_skin, null);
//实现对话框换肤
SkinManager.getInstance().injectSkin(contentView);
DialogSkinBinding binding = DataBindingUtil.bind(contentView);
dialog_skin.setCanceledOnTouchOutside(true);
dialog_skin.show();

注意:SkinManager中添加有sp缓存功能,会将肤色配置后缀缓存起来,如果测试配置过程有问题,先清理下缓存再试。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 本文为原创,转载请注明出处。文章标题为夜间模式,其实我这里想说的不是什么夜间模式,而是Skin库,有了Skin库,...
    SupLuo阅读 1,855评论 4 51
  • 前言: 本文主要讲述如何在项目中,在不重启应用的情况下,实现动态换肤的效果。换肤这块做的比较好的,有网易云音乐,q...
    Yagami3zZ阅读 13,615评论 5 51
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,381评论 0 17
  • 前言 随着一款APP应用功能的不断完善,用户群体的不断增多,APP的更新也就不仅仅局限于功能需求,如何做好良好的用...
    采蘑菇的里奥马阅读 27,852评论 43 146