Android應用如何實現換膚功能

轉載請註明出處,商用請與本人聯繫。java

本系列專題培訓適用範圍:初級Android程序員,即有J2SE基礎和Android初級水平。J2SE基礎是指掌握JAVA語法,1.五、1.6新增的語法不徹底掌握也不要緊。瞭解基本的面向對象思想、能編寫簡單的J2SE程序,掌握基本的調試方法,熟悉Swing更好。Android初級是指掌握Activity、Service、BroadcastReceiver、Intent、SQLite、UI組件的使用,能參照例子編寫簡單的Android應用程序。android

先看一下實現的效果:程序員

啓動時的皮膚

設置pak中的皮膚

設置zip包中的皮膚

 

本節課程的目的:學會換膚的方案及實現,掌握不一樣換膚方案的優缺點及適用場合。工具

但願各位同窗作到:學習某一個技巧就掌握透徹,多練習。最好觸類旁通、舉一反三,掌握分析問題解決問題的思路和方法。佈局

我講解的是原理以及實現的關鍵技術點,細節、優化及與課程主題不相關的或初級的內容可能不會講解。這是免費培訓,精力有限,暫時只能作到讓普通的變優秀,讓優秀的變卓越。你要是已經卓越了來教教我吧。暫時不作入門培訓。學習

國內有不少的軟件都支持皮膚定製,這也是與國外軟件重大不一樣之一,國外用戶注重社交、郵件等功能,國內用戶則重視音樂、小說、皮膚等功能,本節課程就來說解Android應用程序如何實現換膚功能。字體

軟件換膚從功能上能夠劃分三種:優化

1) 軟件內置多個皮膚,不可由用戶增長或修改;ui

最低的自由度,軟件實現相對於後兩種最容易。spa

2) 官方提供皮膚供下載,用戶可使用下載的皮膚;

用戶可選擇下載本身喜歡的皮膚,有些玩家會破解皮膚的定製方法,本身作皮膚使用,或者傳到網上給你們用。

3) 官方提供皮膚製做工具或方法,用戶可自制皮膚。

這種方式使用戶有參與感,自由度較高。用戶可根據本身的喜愛定製軟件的皮膚。有些軟件官網提供皮膚定製的工具或者方法,我建議最好有可視化帶嚮導的工具。用戶只要本身找一些圖片、修改文字的字體替換就能夠了。用戶能夠上傳自制的皮膚,提供其餘用戶下載,還能夠賺得一些虛擬貨幣或者獎品什麼的。這種通常都是打包爲.zip格式的。擴展名可由各公司自定義,有製做工具的話直接導出來最方便。

首先咱們要弄清楚換膚的定義,軟件皮膚包括圖標、字體、佈局、交互風格等,換膚就是換掉皮膚包括的部分或全部資源。

前面提到的三種皮膚,從軟件實現上來看,它們的本質區別是皮膚是否內置到應用程序中。對於內置的實現比較簡單,只要在開發應用的過程當中設計幾套皮膚供用戶選擇。這裏用到的知識不超過Android基礎,不詳細講解。

本節課程重點講解如何實現皮膚與應用程序分離。

皮膚通常含有多個文件,例如圖片、配置等文件,分散的文件不利於傳輸和使用,最好打包。打包的格式通常選擇zip格式。這裏分兩種狀況,一種是apk,例如AdwLauncher,它的桌面皮膚格式是一個apk;另外一種是自定義擴展名,例如墨跡天氣皮膚擴展名是mja,搜狗輸入法的皮膚擴展名是sga,它們的文件格式實際上都是zip。

下面咱們分別講解。

一.apk格式

如今的問題變成了一個應用如何讀取另外一個apk中的資源。

在android系統中,apk之間能夠相互讀取數據的條件是:有一樣的簽名,而且AndroidManifest.xml文件中配置的android:sharedUserId屬性值相同,那麼兩個apk運行在同一個進程中,能夠互相訪問任意數據。

方法以下:

1) 應用程序和皮膚程序的AndroidManifest.xml中配置

例如: android:sharedUserId="org.yuchen"

2) 文件與應用apk中對同一功能的皮膚文件名要一致

例如:應用程序的背景圖片路徑:/SkinDemo/res/drawable-hdpi/bg.png

那麼皮膚apk中的背景圖片文件路徑也應該是:

CustomSkin/res/drawable-hdpi/bg.png

3)訪問資源的方法

[java] view plaincopyprint?

  1. Context context = createPackageContext("com.yuchen.customskin", Context.CONTEXT_IGNORE_SECURITY);  

  

獲取到org.yuchen.customskin對應的Context,經過返回的context對象就能夠訪問到org.yuchen.customskin中的任何資源。

例如:應用apk要得到皮膚apk中的bg.png,

[java] view plaincopyprint?

  1. Drawable drawable = context.getResources().getDrawable(R.drawable.bg);  

這樣就獲得了圖片的引用,其餘xml資源文件的獲取方式也是相似的。

二.自定義擴展名的zip格式的皮膚

技術點在於如何去讀取zip文件中的資源以及皮膚文件存放策略。

方案:若是軟件每次啓動都去讀取SD卡上的皮膚文件,速度會比較慢。較好的作法是提供一個皮膚設置的界面,用戶選擇了哪個皮膚,就把那個皮膚文件解壓縮到」/data/data/[package name]/skin」路徑下,這樣不須要跨存儲器讀取,速度較快,並且不須要每次都去zip壓縮包中讀取,不依賴SD卡中的文件,即便皮膚壓縮包文件被刪除了也沒有關係。

實現方法:

1. 在軟件的幫助或者官網的幫助中提示用戶將皮膚文件拷貝到SD卡指定路徑下。

2. 在軟件中提供皮膚設置界面。能夠在菜單或者在設置中。可參考墨跡、搜狗輸入法、QQ等支持換膚的軟件。

3. 加載指定路徑下的皮膚文件,讀取其中的縮略圖,在皮膚設置界面中顯示,將用戶選中的皮膚文件解壓縮到」/data/data/[package name]/skin」路徑下。

4. 軟件中優先讀取」/data/data/[package name]/skin/」路徑下的資源。若是沒有則使用apk中的資源。

源代碼及答疑都在QQ羣中。

相關文章
相關標籤/搜索