使用SkinManager實(shí)現(xiàn)換膚功能

試著用鴻洋大神寫的SkinManager實(shí)現(xiàn)了換膚功能。

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

//換膚功能
compile 'com.zhy:changeskin:4.0.2'

這樣就配置好了,然后在程序入口進(jìn)行初始化。

二、全局初始化
在自己創(chuàng)建的繼承application的類中添加:

//換膚sdk初始化
SkinManager.getInstance().init(this);

這個(gè)類肯定要在清單文件<application/>節(jié)點(diǎn)配置的。
接下來還需要注冊。

三、注冊
在清單文件中添加權(quán)限:

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

在使用換膚功能的頁面onCreate()中注冊:

//換膚功能頁面注冊
SkinManager.getInstance().register(this);

有注冊當(dāng)然有注銷啊,在onDestroy方法中取消注冊:

//換膚功能注銷
SkinManager.getInstance().unregister(this);

四、命名規(guī)則
1、SkinManager命名規(guī)則是:前綴 + “_” + 后綴;
2、前綴、后綴的命名由開發(fā)者自行定義;
3、同屬性不同膚色前綴一樣,不同屬性前綴不一樣;

//例如:定義textColor屬性值為@color/skin_text,不同膚色color命名前綴均為skin_text

4、后綴根據(jù)膚色主題配置,每個(gè)主題所有屬性后綴一樣;

//例如:膚色有黑色、白色兩種主題,如果黑白定義為“black”“white”,
//那么不管是textColor還是background屬于黑色主題的后綴就是black,屬于白色主題的后綴就是white。

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

<!--黑底白字(默認(rèn)主題)-->
<color name="skin_text">#FFFFFF</color>
 
<!--黑底白字(黑色主題)-->
<color name="skin_text_black">#FFFFFF</color>

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

2、在res/drawable下創(chuàng)建背景shape:
skin_bg.xml(默認(rèn)主題)

<?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下導(dǎo)入不同主題圖片:

//圖片同樣以skin_src.png、skin_src_white.png、skin_src_black.png命名

注意:這三種膚色配置非必須,1常用來配置textColor屬性、2常用來配置background屬性、3常用來配置src屬性,根據(jù)項(xiàng)目需要自行設(shè)置

六、布局引用
布局中引用直接設(shè)置tag屬性。
textColor屬性設(shè)置:

 <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屬性設(shè)置:

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

src屬性設(shè)置:

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

注意:使用SkinManager,background屬性不支持@color設(shè)置,只能設(shè)置@drawable/...

七、tag屬性
分為三部分:
第一部分skin是固定值,不可改變;
第二部分skin_text、skin_bg、skin_src是膚色配置前綴;
第三部分textColor、background、src是膚色配置對應(yīng)的屬性;
此外,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" />

同時(shí)設(shè)置了textColor和background屬性。

注意:第二部分(skin_text)不必與對應(yīng)屬性值(android:textColor)的命名(@color/skin_text)完全一致,這里是因?yàn)槲以O(shè)置的skin_text為默認(rèn)主題,如果你設(shè)置skin_text_default為默認(rèn)主題,tag配置不變,屬性值應(yīng)為@color/skin_text_default

八、換膚代碼
以第七項(xiàng)中的TextView點(diǎn)擊事件實(shí)現(xiàn)換膚為布局,在頁面中:

//聲明成員變量,默認(rèn)false,默認(rèn)主題為黑色
private boolean isChange;
//實(shí)現(xiàn)設(shè)置點(diǎn)擊事件
public void changeClick(View view){
        Log.e(TAG, "點(diǎn)擊改變");
        isChange = !isChange;
        if(isChange){
            SkinManager.getInstance().changeSkin("white");
        }else{
            SkinManager.getInstance().changeSkin("black");
        }
    }

使用changeSkin("后綴")就實(shí)現(xiàn)了換膚功能;

如果要在彈窗中添加換膚功能,可以在彈窗布局添加換膚配置后,頁面代碼中調(diào)用SkinManager.getInstance()的injectSkin(View view)方法實(shí)現(xiàn)。

final Dialog dialog_skin = new Dialog(activity, R.style.MyDialogTheme);
View contentView = View.inflate(activity, R.layout.dialog_skin, null);
//實(shí)現(xiàn)對話框換膚
SkinManager.getInstance().injectSkin(contentView);
DialogSkinBinding binding = DataBindingUtil.bind(contentView);
dialog_skin.setCanceledOnTouchOutside(true);
dialog_skin.show();

注意:SkinManager中添加有sp緩存功能,會(huì)將膚色配置后綴緩存起來,如果測試配置過程有問題,先清理下緩存再試。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,941評論 18 139
  • 本文為原創(chuàng),轉(zhuǎn)載請注明出處。文章標(biāo)題為夜間模式,其實(shí)我這里想說的不是什么夜間模式,而是Skin庫,有了Skin庫,...
    SupLuo閱讀 1,912評論 4 51
  • 前言: 本文主要講述如何在項(xiàng)目中,在不重啟應(yīng)用的情況下,實(shí)現(xiàn)動(dòng)態(tài)換膚的效果。換膚這塊做的比較好的,有網(wǎng)易云音樂,q...
    Yagami3zZ閱讀 13,725評論 5 51
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,523評論 0 17
  • 前言 隨著一款A(yù)PP應(yīng)用功能的不斷完善,用戶群體的不斷增多,APP的更新也就不僅僅局限于功能需求,如何做好良好的用...
    采蘑菇的里奧馬閱讀 28,051評論 43 146