MagicaSakura多主題框架

如何不重啟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下載地址: 點擊直接下載

歡迎查看 個人博客.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末世杀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肝集,更是在濱河造成了極大的恐慌瞻坝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杏瞻,死亡現(xiàn)場離奇詭異湿镀,居然都是意外死亡,警方通過查閱死者的電腦和手機伐憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門勉痴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人树肃,你說我怎么就攤上這事蒸矛。” “怎么了胸嘴?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵雏掠,是天一觀的道長。 經(jīng)常有香客問我劣像,道長乡话,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任耳奕,我火速辦了婚禮绑青,結(jié)果婚禮上诬像,老公的妹妹穿的比我還像新娘。我一直安慰自己闸婴,他們只是感情好坏挠,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邪乍,像睡著了一般降狠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庇楞,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天榜配,我揣著相機與錄音,去河邊找鬼吕晌。 笑死蛋褥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聂使。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谬俄,長吁一口氣:“原來是場噩夢啊……” “哼柏靶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溃论,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屎蜓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钥勋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炬转,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年算灸,在試婚紗的時候發(fā)現(xiàn)自己被綠了扼劈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡菲驴,死狀恐怖荐吵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赊瞬,我是刑警寧澤先煎,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站巧涧,受9級特大地震影響薯蝎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谤绳,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一占锯、第九天 我趴在偏房一處隱蔽的房頂上張望袒哥。 院中可真熱鬧,春花似錦烟央、人聲如沸统诺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粮呢。三九已至,卻和暖如春钞艇,著一層夾襖步出監(jiān)牢的瞬間啄寡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工哩照, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挺物,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓飘弧,卻偏偏與公主長得像识藤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子次伶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • afinalAfinal是一個android的ioc痴昧,orm框架 https://github.com/yangf...
    passiontim閱讀 15,429評論 2 45
  • 記否?賴在山澗冠王,棲在溪邊赶撰,坐在石頭上,腳浸山泉里柱彻,浸在溪水里豪娜,心霎時靜了,一絲絲的清涼哟楷、一股細細甜甜的味道涌上心間...
    琥珀微暗閱讀 308評論 0 3
  • 【銷售之王】+誰是真正的常勝將軍卖擅?+地不平 Todywu2013-10-7 看到【銷售之王】這字眼惕虑,貌似來頭不小,...
    todywu閱讀 726評論 0 50
  • 天空濃稠得化不開的霧磨镶,和如巨獸白色絨毛的翻涌的雪花溃蔫,一齊切割出這個晶瑩剔透的瑰麗世界。 刀子一樣的風(fēng)將我的臉扎開一...
    填我十萬八千夢閱讀 378評論 0 9