標籤:
原文地址: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應用程式切換皮膚功能實現