原文地址: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
