Android實(shí)現(xiàn)apk插件方式換膚的實(shí)例講解
1.什么時(shí)候換膚?
xml加載前換膚,如果xml加載后換膚,用戶將會(huì)看見換膚之前的色彩,用戶體驗(yàn)不好。
2.皮膚是什么?
皮膚就是apk,是一個(gè)資源包,包含了顏色、圖片等。
3.什么樣的控件應(yīng)該進(jìn)行換膚?
包含背景圖片的控件,例如textView文字顏色。
4.皮膚與已安裝的資源如何匹配?
資源名字匹配
步驟:
1.xml加載前換膚,意味著需要將所需要換膚的控件收集起來。因此要監(jiān)聽xml加載的過程。
public class BaseActivity extends Activity {
SkinFactory skinFactory;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//監(jiān)聽xml生成的過程
skinFactory = new SkinFactory();
LayoutInflaterCompat.setFactory(getLayoutInflater(),skinFactory);
}
}
2.需要換膚的控件收集到一個(gè)容器中并且不更改自己的邏輯直接換膚(例如:不用在每個(gè)需要換膚的空間里面加上: “ app:...... ” 自定義控件屬性)
思考:
(1)安裝的apk的id與皮膚id是否一樣?
(2)圖片的資源、顏色資源都對(duì)應(yīng)R自動(dòng)生成的id
(3)皮膚包的資源id、R文件的資源id以及app里R文件的資源的id是否是一樣的?——是不一樣的
3.一個(gè)activity有多個(gè)控件(SkinView) 一個(gè)控件對(duì)應(yīng)多個(gè)換膚屬性(SkinItem)

SkinItem來封裝這些值:
attrName-屬性名(background)attrValue-屬性值id 十六進(jìn)制(@color/colorPrimaryDark)attrType--類型(color)Id(R文件的id)
class SkinItem{
// attrName background
String attrName;
int refId;
// 資源名字 @color/colorPrimaryDark
String attrValue;
// drawable color
String attrType;
public SkinItem(String attrName, int refId, String attrValue, String attrType) {
this.attrName = attrName;
this.refId = refId;
this.attrValue = attrValue;
this.attrType = attrType;
}
public String getAttrName() {
return attrName;
}
public int getRefId() {
return refId;
}
public String getAttrValue() {
return attrValue;
}
public String getAttrType() {
return attrType;
}
}
SkinView:
class SkinView{
private View view;
private List<SkinItem> list; //收集需要換膚的集合
public SkinView(View view, List<SkinItem> list) {
this.view = view;
this.list = list;
}
}
4.收集完畢后,應(yīng)用換膚 (xml加載過程中換膚)

創(chuàng)建SkinManager去獲得皮膚apk,app通過SkinManager獲取皮膚apk
(1)加載皮膚包(loadSkin):通過反射獲得AsserManager的addAssetpath()方法,再通過這個(gè)方法獲得皮膚apk,從而實(shí)例化skinResource;再通過PackageManager.getPackageArchiveInfo(path,PackageManager.GET_ACTIVITIES).packageName;獲得皮膚包名
(2)獲取顏色(getColor):判斷skinResource是否為空;拿到res的名字,eg:通過“colorAccent”去尋找id
Android實(shí)現(xiàn)apk插件方式換膚
以上就是本次介紹的全部知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。
- Android開發(fā)實(shí)現(xiàn)切換主題及換膚功能示例
- android使用SkinManager實(shí)現(xiàn)換膚功能的示例
- Android 換膚技術(shù)資料整理
- android換膚功能 如何動(dòng)態(tài)獲取控件中背景圖片的資源id?
- Android應(yīng)用開發(fā)中實(shí)現(xiàn)apk皮膚文件換膚的思路分析
- 分析Android App中內(nèi)置換膚功能的實(shí)現(xiàn)方式
- Android編程實(shí)現(xiàn)換膚功能實(shí)例
- Android實(shí)現(xiàn)換膚的兩種思路分析
- 基于Android-Skin-Loader實(shí)現(xiàn)換膚效果
相關(guān)文章
Crashlytics Android 異常報(bào)告統(tǒng)計(jì)管理(詳解)
下面小編就為大家?guī)硪黄狢rashlytics Android 異常報(bào)告統(tǒng)計(jì)管理(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Android實(shí)現(xiàn)View滑動(dòng)的幾種方式
Android中的View類是所有UI控件的基類(Base class),也就是說我們平時(shí)所有到的各種UI控件,比如Button、ImagView等等都繼承自View類。這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)View滑動(dòng)的幾種方式,需要的朋友可以參考下2016-04-04
Android利用Camera實(shí)現(xiàn)中軸3D卡牌翻轉(zhuǎn)效果
這篇文章主要介紹了Android利用Camera實(shí)現(xiàn)中軸3D卡牌翻轉(zhuǎn)效果,需要的朋友可以參考下2015-12-12
Android開發(fā)使用Messenger及Handler進(jìn)行通信的方法示例
這篇文章主要介紹了Android開發(fā)使用Messenger及Handler進(jìn)行通信的方法,結(jié)合實(shí)例形式分析了Android使用Messenger及Handler定義客戶端與服務(wù)器端實(shí)現(xiàn)通信的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Android 3.0引入的異步加載機(jī)制Loader
Loader裝載器從android3.0開始引進(jìn)。它使得在activity或fragment中異步加載數(shù)據(jù)變得簡(jiǎn)單。下面我們就來詳細(xì)講解下2017-12-12
Android自定義View實(shí)現(xiàn)垂直時(shí)間軸布局
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)垂直時(shí)間軸布局的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

