android使用SkinManager實現(xiàn)換膚功能的示例
試著用鴻洋大神寫的SkinManager實現(xiàn)了換膚功能。
一、配置
在app下build.gradle中添加依賴:
//換膚功能 compile 'com.zhy:changeskin:4.0.2'
這樣就配置好了,然后在程序入口進(jìn)行初始化。
二、全局初始化
在自己創(chuàng)建的繼承application的類中添加:
//換膚sdk初始化 SkinManager.getInstance().init(this);
這個類肯定要在清單文件<application/>節(jié)點配置的。
接下來還需要注冊。
三、注冊
在清單文件中添加權(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ù)膚色主題配置,每個主題所有屬性后綴一樣;
//例如:膚色有黑色、白色兩種主題,如果黑白定義為“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ù)項目需要自行設(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è)置了textColor和background屬性。
注意:第二部分(skin_text)不必與對應(yīng)屬性值(android:textColor)的命名(@color/skin_text)完全一致,這里是因為我設(shè)置的skin_text為默認(rèn)主題,如果你設(shè)置skin_text_default為默認(rèn)主題,tag配置不變,屬性值應(yīng)為@color/skin_text_default
八、換膚代碼
以第七項中的TextView點擊事件實現(xiàn)換膚為布局,在頁面中:
//聲明成員變量,默認(rèn)false,默認(rèn)主題為黑色 private boolean isChange; //實現(xiàn)設(shè)置點擊事件 public void changeClick(View view){ Log.e(TAG, "點擊改變"); isChange = !isChange; if(isChange){ SkinManager.getInstance().changeSkin("white"); }else{ SkinManager.getInstance().changeSkin("black"); } }
使用changeSkin("后綴")就實現(xiàn)了換膚功能;
如果要在彈窗中添加換膚功能,可以在彈窗布局添加換膚配置后,頁面代碼中調(diào)用SkinManager.getInstance()的injectSkin(View view)方法實現(xiàn)。
final Dialog dialog_skin = new Dialog(activity, R.style.MyDialogTheme); View contentView = View.inflate(activity, R.layout.dialog_skin, null); //實現(xiàn)對話框換膚 SkinManager.getInstance().injectSkin(contentView); DialogSkinBinding binding = DataBindingUtil.bind(contentView); dialog_skin.setCanceledOnTouchOutside(true); dialog_skin.show();
注意:SkinManager中添加有sp緩存功能,會將膚色配置后綴緩存起來,如果測試配置過程有問題,先清理下緩存再試。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)中關(guān)于獲取當(dāng)前Activity的一些思考
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)過程中,關(guān)于獲取當(dāng)前Activity的一些思考,感興趣的小伙伴們可以參考一下2016-02-02Android編程實現(xiàn)Listview點擊展開和隱藏的方法
這篇文章主要介紹了Android編程實現(xiàn)Listview點擊展開和隱藏的方法,涉及Android中Listview的響應(yīng)點擊與樣式變換相關(guān)操作技巧,需要的朋友可以參考下2015-12-12Android開發(fā)中4個常用的工具類【Toast、SharedPreferences、網(wǎng)絡(luò)及屏幕操作】
這篇文章主要介紹了Android開發(fā)中4個常用的工具類,包括Toast管理、SharedPreferences存儲管理、網(wǎng)絡(luò)操作及屏幕操作等功能的封裝類,需要的朋友可以參考下2017-11-11Android apk 項目一鍵打包并上傳到蒲公英的實現(xiàn)方法
這篇文章主要介紹了Android apk 項目一鍵打包并上傳到蒲公英,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Android Studio出現(xiàn)Failed to pull selection: open failed: Permi
本篇文章給大家分享了Android Studio中導(dǎo)出數(shù)據(jù)庫文件的方法以及出現(xiàn)Failed to pull selection: open failed: Permission denied的解決思路,有興趣的學(xué)習(xí)下。2018-05-05