Android應用程式切換皮膚功能實現

來源:互聯網
上載者:User

標籤:

原文地址:http://www.eoeandroid.com/thread-318159-1-1.html

現在大多數android應用都支援切換皮膚的功能。比如千千靜聽,墨跡天氣等等。本文介紹兩種切換皮膚的方法。1.第一種是通過安裝皮膚apk的方式。當安裝了皮膚apk包之後,主程式只需要讀取皮膚apk包裡的圖片資源。就可以實現切換皮膚了。要擷取apk皮膚包裡的圖片資源,需要擷取到皮膚apk包的上下文Context.[mw_shl_code=java,true]  try {
   currentContext = context.createPackageContext(
   packageName, //packageName是對應皮膚apk包的包名。
   Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);
   
   } catch(Exception e) {
   e.printStackTrace();
   }[/mw_shl_code] 圖片資源的名字和位置要一致。好比如整個介面的背景mainbg.jpg,在主程式和皮膚包apk的位置都在res\drawable-hdpi\mainbg.jpg.下。然後通過下面這個方法:[mw_shl_code=java,true]  public static Drawable getDrawable(Context context,String drawableName) throws NotFoundException {
   Drawable resultDrawable =null;
   Context ct =getSkinContext(context);
   try{
   int resid=getIdentifier2(ct,drawableName.trim(),"drawable");
   if(resid == 0){ 
   resid=getIdentifier2(context,drawableName.trim(),"drawable");
   resultDrawable=context.getResources().getDrawable(resid);
   }else{
   resultDrawable=ct.getResources().getDrawable(resid);
   }
   }catch(Exception e){
   e.printStackTrace();
   
   }
   return resultDrawable;
   }[/mw_shl_code]就可以擷取到對應的皮膚資源。可以看到,首先是根據通過下面這個方法,擷取到對應資源的id,然後再更加id擷取到對應的圖片資源。[mw_shl_code=java,true]  public static int getIdentifier2(Context context,String name,String defType) throws NotFoundException{
   int result=0;
   try{
   result = context.getResources().getIdentifier(name, defType, context.getPackageName());
   }catch(Exception e){
   e.printStackTrace();
   
   }
   return result;
   }[/mw_shl_code]然後再設定對應控制項的drawable.就實現了切換皮膚。因為皮膚apk包的上下文經常用到,因此我用一個靜態變數儲存了起來。假如在皮膚包apk裡找不到對應的圖片資源,就在主程式的圖片資源裡找,不至於圖片找不到,讓介面空白。2.第二種方式是把所有圖片資源放到一起,打成一個壓縮包。應用的時候把圖片解壓到sd卡或者是應用的data目錄下。通過下面方法,得到圖片資源的Drawable。在把Drawable 設定到控制項上。[mw_shl_code=java,true]public static Drawable createDrawableByPath(Context context,String imagePath){
try {

if(StringUtils.isNull(imagePath))return null;

Bitmap bm = BitmapFactory.decodeFile(imagePath);

bm.setDensity(context.getResources().getDisplayMetrics().DENSITY_HIGH);

Drawable dw = new BitmapDrawable(context.getResources(), bm);

return dw;

} catch (Exception e) { 
e.printStackTrace();
}catch (OutOfMemoryError ex) {
System.gc();
ex.printStackTrace(); 

return null;
}[/mw_shl_code]因為sd卡有時候會載入不成功。或者是根本沒有sd卡。所有我把圖片的壓縮包直接解壓到了context.getFilesDir().getPath() + File.separator + "skin"+ File.separator下。主程式只實現一個簡單的換膚功能。就只有兩個介面,一個是主介面,它的背景顯示一個背景,就是各個皮膚。另外一個是設定皮膚介面。
點擊後就到了設定皮膚的介面:
另外兩個皮膚工程分別是晴天皮膚和夜晚皮膚。這兩個工程非常簡單,其實根本不需要activity。只需要把圖片mainbg.jpg放到res\drawable-hdpi\mainbg.jpg.下。另外兩個閃電皮膚zip包和大雪皮膚zip包,我已經放到了主程式裡。點擊按鈕就解壓。當然舉例子少不了蒼老師,呵呵。當點擊蒼老師皮膚zip時,會類比從網路下載zip包實現切換皮膚。[mw_shl_code=java,true]  mProgressDialog = ProgressDialog.show(SetSkinActivity.this,
   "", 
   "正在下載蒼老師...", true, false);
   
   handler.postDelayed(new Runnable() {
   
   @Override
   public void run() {
   try {
   mProgressDialog.cancel();
   Toast.makeText(SetSkinActivity.this, "蒼老師下載完畢!", Toast.LENGTH_LONG).show();
   
   
   ZipUtil.unZip(getAssets().open("cang.zip"), 
   Constant.SKIN_DIR+"cang.zip", Constant.SKIN_DIR);
   
   Constant.setAppSkin(SetSkinActivity.this, SetSkinActivity.this.getPackageName());
   restartMain();
   
   } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
   
   }
   }, 3000);
   [/mw_shl_code]
換膚效果:      最後是源碼:
Android, 加密, 皮膚<ignore_js_op>

2.0.zip

 

6.5 MB, 下載次數: 137

Android應用程式切換皮膚功能實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.