Android一鍵換膚功能實(shí)現(xiàn)

市面上對(duì)數(shù)的App都提供換膚功能,這里暫且不講白天和夜間模式

下圖是網(wǎng)易云音樂的換膚功能


經(jīng)典

換膚其實(shí)就是替換資源(文字、顏色、圖片等)

一、換膚模式:

1.內(nèi)置換膚

? ??????????在Apk包中存在多種資源(圖片、顏色值)用于換膚時(shí)候切換。

? ????自由度低,apk文件大? 一般用于沒有其他需求的日間/夜間模式app?

2.動(dòng)態(tài)換膚

? ??????通過運(yùn)行時(shí)動(dòng)態(tài)加載皮膚包

網(wǎng)易云下載的資源包

二、換膚流程



流程

2.1 采集


采集

2.2 如何采集

????????怎么才能拿到所有的view這才是關(guān)鍵!那么我們只能從setContentView()入手

那么問題來了setContentView()到底干了什么

查看源碼發(fā)現(xiàn)setContentView()通過LayoutInflater將xml轉(zhuǎn)換成View加載到window中


源碼三連

inflate干了什么?

干貨來了!!!!

LayoutInflate 的核心是createViewFromTag()


View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,

boolean ignoreThemeAttr) {

????????????...............

????View view;

????????if (mFactory2 !=null) {//核心View的創(chuàng)建工廠 是一個(gè)接口?

????????????????view =mFactory2.onCreateView(parent, name, context, attrs);

? ? ? ? ?}else if (mFactory !=null) {

????????????????view =mFactory.onCreateView(name, context, attrs);

? ? ? ? ?}else {

????????????view =null;

????????}????????

????????if (view ==null &&mPrivateFactory !=null) {

????????????view =mPrivateFactory.onCreateView(parent, name, context, attrs);

????????}

????????if (view ==null) {

????????????????????final Object lastContext =mConstructorArgs[0];

????????????????mConstructorArgs[0] = context;

????????????try {

????????????????if (-1 == name.indexOf('.')) {//判斷是否是自定義View

????????????????view = onCreateView(parent, name, attrs);

????????????????}else {

????????????????view = createView(name,null, attrs);

????????????}

????????}finally {

????????????????mConstructorArgs[0] = lastContext;

????????}

????????}

????????return view;

????}

通過分析上面代碼可以看出Factory2如果不為空那么就調(diào)用Factory2的方法創(chuàng)建View

否者就使用onCreateView()方法創(chuàng)建View


那么如果我們給定一個(gè)Factory那么我們就可以監(jiān)視所有的view

View設(shè)置資源文件的流程如圖所示

當(dāng)我們拿到當(dāng)前View的資源名稱時(shí)就會(huì)先去插件中的資源文件里找。

這就是換膚的原理


加載外部Apk資源文件

拿到資源文件相信剩下的大家就知道怎么玩了

代碼已經(jīng)上傳給 github,歡迎大家一起討論研究

android一鍵換膚功能

使用方式


初始化


使用

皮膚包就是一個(gè)只有資源文件的Apk

大家可以看一下我其他文章哦

基于APT的android路由框架(一)

基于APT的android路由框架(二)--APT技術(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評(píng)論 18 399
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,524評(píng)論 0 17
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,053評(píng)論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,948評(píng)論 18 139
  • 在第一和第二部分,我們了解了Core Animation提供的關(guān)于繪制和動(dòng)畫的一些特性。Core Animatio...
    雪_晟閱讀 973評(píng)論 0 1