如何不重啟APP切換多主題询件?
如何只寫一份drawable或layout就可以自動適配各種多主題缚忧?
如何兼容低版本的Android系統(tǒng)僵控?
如何減少開發(fā)人員的學(xué)習(xí)成本痕钢,能夠快速適應(yīng)多主題框架图柏?
開源多主題框架 MagicaSakura 都可以幫你做到。
(備注:此處的多主題是指輕量級的多彩主題色任连,而非插件化形式的多主題皮膚)
不重啟APP切換主題
MagicaSakura提供了全局方法Theme.refreshUI蚤吹,直接調(diào)用即可無需重啟App更換應(yīng)用主題(當(dāng)然必須得在主線程-,-)随抠,同時該方法提供了額外的回調(diào)參數(shù)裁着,以便滿足在主題切換過程中的各種自定義需求。
自適應(yīng)多主題
-
Drawable XML
使用預(yù)先定義的顏色值拱她,只需編寫一份drawable即可自動適配多主題樣式二驰,無需再為每一種主題都編寫一份drawable或style。selector秉沼,item , shape, layerlist桶雀,color 等常規(guī)xml標簽都已支持矿酵,能滿足應(yīng)用基本開發(fā)需求。
-
額外支持在xml中直接染色 (app : drawableTint , app : drawableTintMode) 以及在shape標簽中配置顏色透明度(android : alpha)矗积。如:
- 直接染色
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:drawable="@drawable/icon " android:state_pressed="true"
- 直接染色
app:drawableTint="@color/theme_color_primary" />
<item android:drawable="@drawable/icon" app:drawableTint="@color/gray_dark" />
</selector>
```
- 標簽配置顏色透明度
```java
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:state_pressed="true">
<shape>
<corners android:radius="4dp" />
<solid android:color="@color/theme_color_primary_dark" />
</shape>
</item>
<item android:state_enabled="true">
<shape>
<solid android:color="@color/theme_color_primary" />
<corners android:radius="4dp" />
</shape>
</item>
<item android:state_enabled="false">
<shape>
<solid android:alpha="0.3" android:color="@color/theme_color_primary" />
<corners android:radius="4dp" />
</shape>
</item>
</selector>
```
-
Layout XML
使用MagicaSakura中的提供的TintXXX控件可以在layout 中直接對其drawable屬性進行染色全肮,如:background, src, drawableLeft, button 等,并且包括文字顏色棘捣,超鏈接顏色在內(nèi)都可以自動跟隨多主題變化倔矾,非常快捷方便柱锹。
// TintTextView
//其中drawableRightTint中的selector_lock是一個ColorStateList
<com.bilibili.magicasakura.widgets.TintTextView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="@dimen/padding_half"
android:drawableRight="@drawable/selector_lock"
android:text="@string/textview_title"
android:textColor="@color/selector_text"
android:textSize="19sp"
app:drawableRightTint="@color/selector_lock"/>
- **代碼中適配多主題**
MagicaSakura支持在代碼中直接適配多主題。
- 對于MagicaSakura中的TintXXX控件
在代碼中可以直接對TintXXX控件的相關(guān)drawable進行染色丰包,使用方法與Android原生控件基本一致禁熏,例子如下:
``` java
//TextView的background是一個shape類型的selector,那么就可以直接調(diào)用setBackgroundResource()方法進行染色。
tintTextView.setBackgroundResource(R.drawable.selector_shape_lock);
//ImageView的src是一個包含png的selector邑彪,那么只需比Android原生控件多調(diào)用一個方法瞧毙。
tintImageView.setImageResource(R.drawable.selecor_png_lock);
tintImageView.setImageTintList(R.color.selector_color_lock);
- 對于一些特殊需求或一些自定義控件
MagicaSakura中提供了ThemeUtils工具類,該工具類主要提供了drawable染色以及主題色自動轉(zhuǎn)換的相關(guān)方法寄症,其中主題色自動轉(zhuǎn)換支持colorStateList和 color宙彪,可以非常方便的在代碼中進行多主題適配。// R.color.selector_color.lock 通過 getThemeColorStateList轉(zhuǎn)換有巧,返回主題色相關(guān)的colorStateList释漆。 ThemeUtils.getThemeColorStateList(context, R.color.selector_color.lock);
兼容低版本的Android系統(tǒng)
MagicaSakura目前兼容的最低SDK版本為API 15,即Android 4.0.3版本篮迎,基本符合絕大多數(shù)APP開發(fā)中的最低API要求男图。
盡量減少學(xué)習(xí)成本
為減少學(xué)習(xí)成本,MagicaSakura基于Android原生控件封裝了一套TintXXX控件甜橱,包含所有常用的控件類型逊笆,如:TextView,Button岂傲,EditText, ProgressDialog等难裆,能基本滿足常規(guī)應(yīng)用開發(fā)需求。
TintXXX控件可自動適配多主題樣式镊掖,支持在layout.xml乃戈,drawable.xml 和代碼中配置。特別的在layout.xml中可以方便地與Android原生屬性配合使用亩进,如 app:drawableLeftTint可以直接染色android:drawableLeft偏化,app: backgroundTint 直接染色android:background等。
關(guān)于夜間模式和多主題皮膚
MagicaSakura支持夜間模式平滑切換(即無需重啟應(yīng)用)镐侯,只需在res中按需添加相關(guān)的xxx_night資源文件包侦讨。
特別得當(dāng)app的support庫版本低于23.2.0時驶冒,可以直接使用MagicaSakura內(nèi)提供的ThemeUtils.updateNightMode()方法切換夜間模式,當(dāng)support庫版本大于等于23.2.0時可以使用support庫提供的方法韵卤。其實Android是原生支持夜間模式的骗污,更多介紹可以詳見android多主題之坑這篇文章。
多主題皮膚和多彩主題是不完全相同的沈条,支持多主題皮膚一般需要引入插件框架需忿,而多彩主題則相對輕量一些。目前MagicaSakura暫不支持多主題皮膚蜡歹,以后會考慮增加對其的支持屋厘。
開源
經(jīng)過幾周的籌備和優(yōu)化,現(xiàn)正式將多主題框架MagicaSakura開源月而,希望能對你有所幫助汗洒。
相關(guān)源碼和詳細文檔都已在GitHub開源,歡迎大家來圍觀父款,指出不足之處溢谤,一起來完善MagicaSakura多主題框架。
傳送門地址:MagicaSakura憨攒。Demo下載地址: 點擊直接下載
歡迎查看 個人博客.