您好,登錄后才能下訂單哦!
這篇文章主要講解了“Android APP怎么換膚”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android APP怎么換膚”吧!
目前Android APP
換膚大體可分為兩大類:
兩套主題的切換(比如白天/黑夜),使用一個開關按鈕進行切換。
多套主題在線下載并更新。
第一種的實現基本上使用設置本地Theme
來操作,即將所有的資源打包到APP
中,并且根據主題進行切換。 第二種不可能使用第一種的實現方式,因為將所有資源都打包到APP
中缺乏靈活性,不利于活動的更新,并且也會使得apk
包的體積變大。所有第二種的實現必須是支持線上下載的。
配合產品的需求并且能實現換膚的靈動性,我們選擇上述的第二種方案。經過之前的Android
和IOS
成員小組討論,統一覺得可以采用下載壓縮包,并通過解析壓縮包讀取資源進行替換。
壓縮包下載下來后怎么讀取資源?這里有兩種方式:
將下載的皮膚包進行解壓縮并且通過文件流的方式讀取里面的圖片資源、文件資源。
將下載的皮膚包加載到assetManager
管理器中,并通過該管理器新建一個Resource
對象,需要換膚的控件通過Resource
對象進行讀取資源。
第一種方式需要手動開啟文件流,并且不同的文件流有不同的文件流方式,比如圖片、文本文件等,還有不同設備由于分辨率加載的資源是不同的,如何合理地去選擇合適的資源去加載也是一個需要解決的問題。
第二種方式需要將皮膚包加載到assetManager
管理器,assetManager
管理器新生成的Resource
對象和我們主工程的Resource
對象是相同類的不同對象,可以使用我們熟悉的方式去加載資源(如resource.getColor
,resource.getDrawable
等)。
基于上述兩種加載資源的方式,這里選擇第二種方式進行資源的加載與讀取。
1、將所需的皮膚包通過網絡下載到本地,這里的皮膚包是一個apk
文件,為了讓apk
包足夠小,里面只包含資源文件。可能有多個皮膚包,比如theme1.skin
,theme2.skin
......
2、通過后臺獲取需要加載的皮膚包的名字,如theme1.skin,通過調用AssetManager對象的addAssetPath方法并生成一個新的Resource對象,如下代碼:
AssetManager assetManager = AssetManager.class.newInstance(); //由于addAssetPath()這個方法被隱藏掉了,所以不能直接使用對象直接訪問, //這里使用了反射的方式,作用是將該皮膚包加入到asset管理器中 Method addAssetPath = assetManager.getClass().getMethod("addAssetPath" , String.class); addAssetPath.invoke(assetManager, skinPath); Resources skinResource = new Resources( assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
3、自定義一個InflaterFactory
的子類,SkinInflaterFactory
,重寫onCreateView(View, String, Context, AttributeSet)
方法,對于需要換膚的控件進行屬性的解析與存儲,然后對這些換膚的控件去第二步的Resource
對象中加載資源并設置到這些控件中。
4、在BaseActivity
的onCreate
方法新建SkinInflaterFactory
對象,并將該SkinInflateFactory
對象設置給Activity
的LayoutInflater
對象,如下代碼:
protected void onCreate(@Nullable Bundle savedInstanceState) { mSkinInflaterFactory = new SkinInflaterFactory(); LayoutInflaterCompat.setFactory( getLayoutInflater(), mSkinInflaterFactory); super.onCreate(savedInstanceState); }
1、如何支持控件點擊后觸發不同的業務流程?
可以通過自定義一個屬性,如skin:click="@string/clickAction"
,主工程的clickAction="muapp://app/testDefault"
,皮膚包里的clickAction="muapp://app/testClick"
,通過目前項目中的路由機制觸發不同的跳轉動作。比如說上述默認的跳轉是跳轉到主工程(app
為module
名)的TestDefaultAction
(注解actionName="testDefault"
)類的invoke
方法中,而更改后會跳轉到主工程(app
為module
名)的TestClickAction
(注解actionName="testClick"
)類的invoke
方法中。
2、如何支持控件的不同行為方式?例如不同的動畫效果等
這個問題和第一個問題的處理方式的類似的,同樣可以通過主工程和皮膚包不同的tag
(String
文案)處理不同的行為方式。
3、如何處理自定義View
的換膚需求?
可以添加一個方法,將自定義View需要換膚的屬性名(如background
),屬性值(如background
對應的圖片的資源ID
)傳遞到方法中,然后去皮膚包的Resource
對象中尋找是否有相應的可替換的皮膚或者可替換的行為。
感謝各位的閱讀,以上就是“Android APP怎么換膚”的內容了,經過本文的學習后,相信大家對Android APP怎么換膚這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。