Android換膚

??目前比較流行的幾種換膚方案是基于開源框架Android-skin-support、Android-Skin-Loader蛇摸、修改樣式換膚還有鴻洋的換膚方案。本文介紹的是基于Android-skin-support的換膚方案https://github.com/ximsfei/Android-skin-support

1.依賴

   compile'skin.support:skin-support:2.2.3' // skin-support 基礎(chǔ)控件支持  
   compile 'skin.support:skin-support-design:2.2.3' // skin-support-design material design 控件支持[可選] 其他的可參考官方文檔疯暑。

2.使用

在MyApplication的onCreate中初始化
   SkinCompatManager.withoutActivity(this)
                .addInflater(new SkinMaterialViewInflater())
                //如果需要從sd卡的指定目錄中加載皮膚
                .addStrategy(new CustomSDCardLoader())
                .loadSkin();
    }
皮膚開關(guān)

??如果項目中有特殊需求顿颅。例如, 股票控件: 控件顏色始終為紅色或綠色, 不需要隨著模式切換而換膚那么可以使用類似的方法, 直接設(shè)置drawable

setBackgroundDrawable(redDrawable)和background="#ce3d3a" // 不支持換膚 
setBackgroundResource(resId) 和background="@drawable/red"http://支持換膚
應(yīng)用內(nèi)換膚

??比如我想改變字體顏色恍涂,此時在colors里面添加

    <color name="background">#ff0000</color>//默認(rèn)紅色
    <color name="background_night">#ff0</color>//變?yōu)辄S色

layout中

  <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你好"
        android:textColor="@color/background"
        android:textSize="@dimen/dm_50sp"/>

需要變色的地方調(diào)用

 SkinCompatManager.getInstance().loadSkin("night",SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);//night表示colors中background_night的后綴

還原為原來的皮膚

 SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);
插件式換膚(制作皮膚包)
Assesets下加載皮膚包

??File->New->New Module創(chuàng)建一個新的工程取名為skin-night宝惰,將新的工程下的mipmap,values下的style以及build.gradle下的dependencies節(jié)點刪除(刪除后生成的皮膚包會比較精致再沧,皮膚包大小會很心岫帷)
??比如我們需要替換ImageView的背景以及TextView的顏色。
假如原APK的drawable下有一張test.png的圖片炒瘸,我們在skin-night的drawable下也要有一張test.png的圖片
??原APK的TextView顏色
colors.xml

    <color name="background">#ff0000</color>//默認(rèn)紅色

??skin-night工程中設(shè)置
colors.xml

 <color name="background">#ff0</color>//變?yōu)辄S色

Build->Build APK->將生成的.apk改成night.skin淤堵,并將其復(fù)制到assets下的skins目錄下

skin.png

需要變色的地方調(diào)用

 //原理為先將assets下將皮膚包拷貝到緩存,再從緩存中加載皮膚包
SkinCompatManager.getInstance().loadSkin("night.skin",SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);//night.skin為皮膚包的名稱

還原為原來的皮膚

 SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);
SD卡下加載皮膚包

??皮膚包可以放在服務(wù)器上顷扩,從而減小了APK的負(fù)擔(dān)拐邪。從服務(wù)器中下載到SD卡,然后加載SD卡上的皮膚包隘截。
在MyApplication的onCreate中初始化中添加addStrategy(new CustomSDCardLoader())

   SkinCompatManager.withoutActivity(this)
                .addInflater(new SkinMaterialViewInflater())
                //如果需要從sd卡的指定目錄中加載皮膚
                .addStrategy(new CustomSDCardLoader())
                .loadSkin();
    }

CustomSDCardLoader繼承自SkinSDCardLoader

public class CustomSDCardLoader extends SkinSDCardLoader {
    public static final int SKIN_LOADER_STRATEGY_SDCARD = Integer.MAX_VALUE;

    @Override
    public String loadSkinInBackground(Context context, String skinName) {
        return super.loadSkinInBackground(context, skinName);
    }
        //自定義加載皮膚包的路徑(我們的皮膚包必須要放在getSkinPath返回的路徑下扎阶。否則加載失斝谖浮)
    @Override
    protected String getSkinPath(Context context, String skinName) {
        return new File("sdcard"+File.separator+skinName).getAbsolutePath();
    }

    @Override
    public int getType() {
        return SKIN_LOADER_STRATEGY_SDCARD;
    }
}

將night.skin push到SD卡根目錄


111111111.png

需要變色的地方調(diào)用以下代碼即可

  SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);
動態(tài)添加的View

我們只需要將添加的View寫在布局中,然后添加此布局即可

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        TextView textview = (TextView)View.inflate(this, R.layout.textview, null);
        params.gravity = Gravity.CENTER;
        mLinearLayout.addView(textview, params);

textview.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="你好"
          android:textColor="@color/background">
</Text
自定義View

??官方demo給我們的自定義TextView只是改變背景和文字顏色东臀,可能我們需要的更多是改變自定義View本身的顏色(需要改變畫筆顏色)着饥,我的思路是當(dāng)需要改變皮膚時,我們回調(diào)自定義View中的方法啡邑,在此方法中改變畫筆的顏色贱勃,然后 invalidate();重繪一次。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谤逼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仇穗,更是在濱河造成了極大的恐慌流部,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹坐,死亡現(xiàn)場離奇詭異枝冀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耘子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門果漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谷誓,你說我怎么就攤上這事绒障。” “怎么了捍歪?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵户辱,是天一觀的道長。 經(jīng)常有香客問我糙臼,道長庐镐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任变逃,我火速辦了婚禮必逆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揽乱。我一直安慰自己名眉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布锤窑。 她就那樣靜靜地躺著璧针,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渊啰。 梳的紋絲不亂的頭發(fā)上探橱,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天申屹,我揣著相機(jī)與錄音,去河邊找鬼隧膏。 笑死哗讥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胞枕。 我是一名探鬼主播杆煞,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腐泻!你這毒婦竟也來了决乎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤派桩,失蹤者是張志新(化名)和其女友劉穎构诚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铆惑,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡范嘱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了员魏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丑蛤。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撕阎,靈堂內(nèi)的尸體忽然破棺而出受裹,到底是詐尸還是另有隱情,我是刑警寧澤闻书,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布名斟,位于F島的核電站,受9級特大地震影響魄眉,放射性物質(zhì)發(fā)生泄漏砰盐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一坑律、第九天 我趴在偏房一處隱蔽的房頂上張望岩梳。 院中可真熱鬧,春花似錦晃择、人聲如沸冀值。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽列疗。三九已至,卻和暖如春浪蹂,著一層夾襖步出監(jiān)牢的瞬間抵栈,已是汗流浹背告材。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留古劲,地道東北人斥赋。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像产艾,于是被迫代替她去往敵國和親疤剑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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