亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

仿墨跡天氣在Android App中實(shí)現(xiàn)自定義zip皮膚更換

2020-01-02 07:03:37
字體:
供稿:網(wǎng)友

在這里談一下墨跡天氣的換膚實(shí)現(xiàn)方式,不過首先聲明我只是通過反編譯以及參考了一些網(wǎng)上其他資料的方式推測出的換膚原理, 在這里只供參考. 若大家有更好的方式, 歡迎交流.
墨跡天氣下載的皮膚就是一個zip格式的壓縮包,在應(yīng)用的時候把皮膚資源釋放到墨跡天氣應(yīng)用的目錄下,更換皮膚時新的皮膚資源會替換掉老的皮膚資源每次加載的時候就是從手機(jī)硬盤上讀取圖片,這些圖片資源的命名和程序中的資源的命名保持一致,一旦找不到這些資源,可以選擇到系統(tǒng)默認(rèn)中查找。這種實(shí)現(xiàn)是直接讀取了外部資源文件,在程序運(yùn)行時通過代碼顯示的替換界面的背景資源。這種方式的優(yōu)點(diǎn)是:皮膚資源的格式定義很隨意可以是zip也可以是自定義的格式,只要程序中能夠解析到資源就行,缺點(diǎn)是效率上的問題.

這里需要注意的一點(diǎn)是,再這里對壓縮包的解壓,借助了第三方工具: ant. jar進(jìn)行解壓和壓縮文件. 關(guān)于ant工具的使用,我在稍后的文章中會具體介紹.

主要技術(shù)點(diǎn):
如何去讀取zip文件中的資源以及皮膚文件存放方式

實(shí)現(xiàn)方案:如果軟件每次啟動都去讀取SD卡上的皮膚文件,速度會比較慢。較好的做法是提供一個皮膚設(shè)置的界面,用戶選擇了哪一個皮膚,就把那個皮膚文件解壓縮到”/data/data/[package name]/skin”路徑下(讀取的快速及安全性),這樣不需要跨存儲器讀取,速度較快,而且不需要每次都去zip壓縮包中讀取,不依賴SD卡中的文件,即使皮膚壓縮包文件被刪除了也沒有關(guān)系。
實(shí)現(xiàn)方法:
1. 在軟件的幫助或者官網(wǎng)的幫助中提示用戶將皮膚文件拷貝到SD卡指定路徑下。
2. 在軟件中提供皮膚設(shè)置界面??梢栽诓藛位蛘咴谠O(shè)置中??蓞⒖寄E、搜狗輸入法、QQ等支持換膚的軟件。
3. 加載指定路徑下的皮膚文件,讀取其中的縮略圖,在皮膚設(shè)置界面中顯示,將用戶選中的皮膚文件解壓縮到”/data/data/[package name]/skin”路徑下。
4. 軟件中優(yōu)先讀取”/data/data/[package name]/skin/”路徑下的資源。如果沒有則使用apk中的資源。

效果圖:

2016226153459744.jpg (375×517)

具體代碼:
1. AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"   package="com.tony.skin" android:versionCode="1" android:versionName="1.0">   <uses-sdk android:minSdkVersion="7" />   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   <application android:icon="@drawable/icon" android:label="@string/app_name">     <activity android:name=".Re_Skin2Activity"          android:label="@string/app_name">       <intent-filter>         <action android:name="android.intent.action.MAIN" />         <category android:name="android.intent.category.LAUNCHER" />       </intent-filter>     </activity>    </application> </manifest> 

2.布局文件main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   android:background="#d2d2d2"   android:id="@+id/layout">   <Button android:text="導(dǎo)入皮膚" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>   <Button android:text="換膚" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>   <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"      android:text="請先點(diǎn)擊“導(dǎo)入皮膚”,會將/sdcard/skin.zip導(dǎo)入到/sdcard/Skin_kris目錄下,然后點(diǎn)擊‘換膚'會將sdcard里面的素材用作皮膚"      android:textColor="#000"></TextView> </LinearLayout> 

3. Re_Skin2Activity:

package com.tony.skin;  import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast;  import com.tony.skin.utils.ZipUtil;  /**  *  * @author Tony  *  */ public class Re_Skin2Activity extends Activity implements OnClickListener{   private Button btnSet;   private Button btnImport;   private LinearLayout layout;   /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     btnSet = (Button)findViewById(R.id.button1);     btnSet.setOnClickListener(this);      btnImport = (Button)findViewById(R.id.button2);     btnImport.setOnClickListener(this);     layout = (LinearLayout)findViewById(R.id.layout);   }   @Override   public void onClick(View v) {     switch (v.getId()) {     case R.id.button1:       Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/tony/skin/skin.png");               BitmapDrawable bd=new BitmapDrawable(bitmap);       btnSet.setBackgroundDrawable(bd);              layout.setBackgroundDrawable(new BitmapDrawable(BitmapFactory.decodeFile("/sdcard/Skin_kris/skin/bg/bg.png")));              break;     case R.id.button2:       ZipUtil zipp = new ZipUtil(2049);       System.out.println("begin do zip");       zipp.unZip("/sdcard/skin.zip","/sdcard/Skin_kris");       Toast.makeText(this, "導(dǎo)入成功", Toast.LENGTH_SHORT).show();       break;     default:       break;     }   } } 

4. ZipUtil 解壓縮處理ZIP包的工具類

package com.tony.skin.utils;  import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.Deflater;  import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream;  /**  * Zip包壓縮,解壓處理工具類  * @author a  *  */ public class ZipUtil {   private ZipFile     zipFile;    private ZipOutputStream zipOut;   //壓縮Zip    private int      bufSize;  //size of bytes    private byte[]     buf;    private int       readedBytes;    public ZipUtil(){      this(512);    }     public ZipUtil(int bufSize){      this.bufSize = bufSize;      this.buf = new byte[this.bufSize];    }        /**    *    * @param srcFile 需要 壓縮的目錄或者文件    * @param destFile 壓縮文件的路徑    */   public void doZip(String srcFile, String destFile) {// zipDirectoryPath:需要壓縮的文件夾名     File zipDir;     String dirName;      zipDir = new File(srcFile);     dirName = zipDir.getName();     try {       this.zipOut = new ZipOutputStream(new BufferedOutputStream(           new FileOutputStream(destFile)));       //設(shè)置壓縮的注釋       zipOut.setComment("comment");       //設(shè)置壓縮的編碼,如果要壓縮的路徑中有中文,就用下面的編碼       zipOut.setEncoding("GBK");       //啟用壓縮        zipOut.setMethod(ZipOutputStream.DEFLATED);         //壓縮級別為最強(qiáng)壓縮,但時間要花得多一點(diǎn)        zipOut.setLevel(Deflater.BEST_COMPRESSION);               handleDir(zipDir, this.zipOut,dirName);       this.zipOut.close();     } catch (IOException ioe) {       ioe.printStackTrace();     }   }    /**    * 由doZip調(diào)用,遞歸完成目錄文件讀取    * @param dir    * @param zipOut    * @param dirName 這個主要是用來記錄壓縮文件的一個目錄層次結(jié)構(gòu)的    * @throws IOException    */   private void handleDir(File dir, ZipOutputStream zipOut,String dirName) throws IOException {     System.out.println("遍歷目錄:"+dir.getName());     FileInputStream fileIn;     File[] files;      files = dir.listFiles();      if (files.length == 0) {// 如果目錄為空,則單獨(dú)創(chuàng)建之.       // ZipEntry的isDirectory()方法中,目錄以"/"結(jié)尾.       System.out.println("壓縮的 Name:"+dirName);       this.zipOut.putNextEntry(new ZipEntry(dirName));       this.zipOut.closeEntry();     } else {// 如果目錄不為空,則分別處理目錄和文件.       for (File fileName : files) {         // System.out.println(fileName);          if (fileName.isDirectory()) {           handleDir(fileName, this.zipOut,dirName+File.separator+fileName.getName()+File.separator);         } else {           System.out.println("壓縮的 Name:"+dirName + File.separator+fileName.getName());           fileIn = new FileInputStream(fileName);           this.zipOut.putNextEntry(new ZipEntry(dirName + File.separator+fileName.getName()));            while ((this.readedBytes = fileIn.read(this.buf)) > 0) {             this.zipOut.write(this.buf, 0, this.readedBytes);           }            this.zipOut.closeEntry();         }       }     }   }    /**    * 解壓指定zip文件    * @param unZipfile 壓縮文件的路徑    * @param destFile   解壓到的目錄     */   public void unZip(String unZipfile, String destFile) {// unZipfileName需要解壓的zip文件名     FileOutputStream fileOut;     File file;     InputStream inputStream;      try {       this.zipFile = new ZipFile(unZipfile);        for (Enumeration entries = this.zipFile.getEntries(); entries           .hasMoreElements();) {         ZipEntry entry = (ZipEntry) entries.nextElement();         file = new File(destFile+File.separator+entry.getName());          if (entry.isDirectory()) {           file.mkdirs();         } else {           // 如果指定文件的目錄不存在,則創(chuàng)建之.           File parent = file.getParentFile();           if (!parent.exists()) {             parent.mkdirs();           }            inputStream = zipFile.getInputStream(entry);            fileOut = new FileOutputStream(file);           while ((this.readedBytes = inputStream.read(this.buf)) > 0) {             fileOut.write(this.buf, 0, this.readedBytes);           }           fileOut.close();            inputStream.close();         }       }       this.zipFile.close();     } catch (IOException ioe) {       ioe.printStackTrace();     }   }    // 設(shè)置緩沖區(qū)大小   public void setBufSize(int bufSize) {     this.bufSize = bufSize;   } } 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
www狠狠操| 黄色成人av网| 欧美精品18videos性欧| 成人精品福利视频| 古典武侠综合av第一页| 亚洲日韩欧美一区二区在线| 免费资源在线观看| 国产成人免费视频网站视频社区| 一区二区三国产精华液| 精品国产18久久久久久洗澡| 久久精品国产99| 国产一区二区三区电影在线观看| 国产女主播一区二区三区| 日韩av不卡在线| 欧美国产不卡| 最近2019中文免费高清视频观看www99| 中国一级特黄录像播放| www.久久国产| 成人h动漫精品一区二| 国产制服91一区二区三区制服| 无码人妻久久一区二区三区| 国产视频网站在线观看| 激情成人中文字幕| 国产日韩视频一区| 免费看黄色网址| 欧美在线三级电影| 免费在线观看污污视频| 精品福利一区| 成人福利片在线| 国产人妖伪娘一区91| a视频v在线| 亚洲精品电影网在线观看| 日本黄色精品| 日韩国产在线观看一区| 色88久久久久高潮综合影院| 中文字幕伦理免费在线视频| 伊人网综合在线| 风间由美性色一区二区三区四区| 久久人妻无码aⅴ毛片a片app| 二级片在线观看| 国产精品成人免费观看| 高清美女视频一区| 久色婷婷小香蕉久久| 91精品国产91热久久久做人人| 免费观看日韩av| 综合色就爱涩涩涩综合婷婷| 久久婷婷av| 欧美大片黄色| 久久久久久亚洲精品美女| 韩日精品视频一区| 99精彩视频在线观看免费| 国产精品sss在线观看av| 欧美一区二区大胆人体摄影专业网站| 欧美日产国产精品| 国产精品一卡二卡| 亚洲av无码精品一区二区| 五月婷婷之综合激情| 一区二区三区回区在观看免费视频| 川上优av一区二区线观看| 国产精品区一区二区三含羞草| 欧美性猛交99久久久久99按摩| 香港成人在线视频| 高清视频一区二区三区| 国产日产精品一区二区三区| 岛国视频免费在线观看| 亚洲精品一区三区三区在线观看| 国产精品亚洲人成在99www| 思热99re视热频这里只精品| 日韩在线视频播放| 一区二区三区四区av| 国产精品高清无码| 国产中文字幕在线播放| 蜜臀99久久精品久久久久久软件| 久久国产精品免费一区二区三区| 亚洲国产精品123| 91玉足脚交嫩脚丫在线播放| 日本一区网站| 黄网站视频在线观看| 日本精品一区二区三区高清| 久久亚洲一区二区三区四区五区高| 蜜桃视频久久一区免费观看入口| 美女在线不卡| 成人在线播放视频| 色婷婷久久99综合精品jk白丝| 精品亚洲a∨一区二区三区18| 日韩精品人妻中文字幕有码| 小嫩嫩精品导航| 99亚洲男女激情在线观看| 日韩欧美国产成人精品免费| jizz欧美大全| chinese少妇国语对白| 进去里视频在线观看| 国产亚洲精品美女| 欧美毛片在线观看| jizzjizz日本护士免费| 欧美少妇精品| 欧美日韩夫妻久久| 奇米四色中文综合久久| 大香伊人久久| 国产一区二区三区在线视频| 人人妻人人澡人人爽精品欧美一区| 精品欧美一区二区三区在线观看| 中文字幕中文字幕在线十八区| 国产精品综合二区| 四虎免费av| 亚洲综合色婷婷在线观看| 国产精品久久国产| 一区二区三区精品视频| 性一交一乱一精一晶| 希岛爱理av一区二区三区| 亚洲第一福利在线观看| 国产成人黄色av| 麻豆一区二区99久久久久| 免费成人在线看| 亚洲人人夜夜澡人人爽| 内射毛片内射国产夫妻| 日本一区二区久久| 国产寡妇色xxⅹ交肉视频| 久久亚洲私人国产精品va| 欧美日韩精品免费观看视一区二区| 欧美精品v国产精品v日韩精品| 黄色美女一级片| 久久久综合九色合综国产精品| 欧美日韩在线精品一区二区三区激情综| 久久午夜精品| 日韩不卡的av| 伊人影院久久| 少妇高潮久久久久久潘金莲| 再深点灬舒服灬太大了添少妇视频| 国产中文字幕在线观看| 亚洲图片小说综合| 国产伦精品一区二区三区四区免费| 在线观看国产视频| 国产婷婷色综合av蜜臀av| 一本一本久久a久久综合精品| 哥也色在线视频| 日韩一区欧美二区| 一级片视频免费看| 在线观看小视频| 久草在线资源视频在线观看| 久久亚洲一区二区三区明星换脸| 黄色成人影院| 一区二区三区免费在线| 欧美二区三区在线| 中文字幕av资源| 日本三级午夜理伦三级三| 色婷婷一区二区三区av免费看| 欧美一级裸体视频| 欧美伊人久久久久久久久影院| 日韩一级欧美一级| 青青操在线观看视频| 亚洲成av人片在线| 热99在线视频| 日韩精品一区在线视频| ga∨成人网| 成人午夜视频在线观看| 日韩免费观看高清完整版| 欧美黄色一级大片| 久久久久一区| 成人深夜福利app| 91麻豆免费在线观看| 中文字幕一区在线| 中文字幕求饶的少妇| 青青草在线观看视频| av电影在线观看网址| 国产精品另类一区| 日韩三级电影网| 久久久亚洲福利精品午夜| 欧美精品与人动性物交免费看| 伊人久久大香线蕉综合网站| 国产男人搡女人免费视频| 中文字幕在线看片| 高清精品一区二区三区一区| 有码中文亚洲精品| 夫妇交换中文字幕| 国产欧美日韩精品a在线观看| 亚洲视频你懂的| 国产精品豆花视频| 男人午夜视频| 日韩欧美精品一区二区综合视频| 国产日韩欧美精品在线观看| 黄页视频在线91| 精品伦精品一区二区三区视频密桃| 亚洲国产最新| 日本不卡一区二区在线观看| 国产自产在线视频一区| 欧美综合欧美视频| 久久久久久久国产| 两性午夜免费视频| 小草av在线播放| 先锋影音男人av资源| 久久亚洲国产精品成人av秋霞| jvid福利写真一区二区三区| 成 人片 黄 色 大 片| 欧美黄色激情视频| 97成人超碰视| 日韩精品四区| 国产一二三四区在线观看| 久久中文字幕av一区二区不卡| 欧美伦理影视网| 色噜噜狠狠色综合网| 日韩精品中文字幕在线观看| 国产精品天堂| 日韩在线一二三| 国产在线无码精品| 黄色91在线观看| 亚洲精品免费在线播放| 欧美丰满少妇xxxxx高潮对白| 中文字幕人妻一区二区三区在线视频| av直播在线观看| 天天干在线播放| 午夜精品电影在线观看| 91蜜桃婷婷狠狠久久综合9色| 丁香啪啪综合成人亚洲小说| 免费大秀视频在线播放| 欧美一区二区三区人| 成人免费毛片嘿嘿连载视频| 在线色视频网| 成人欧美一区二区三区黑人免费| 丁香婷婷综合激情五月色| 人妻无码久久一区二区三区免费| 热久久最新地址| 在线欧美一级视频| 亚洲精品在线播放| 欧美亚洲国产精品久久| 国产在线视精品麻豆| 尤物在线观看一区| 久久99999| 一区二区在线观看视频在线观看| 操人视频在线观看欧美| 国产精品2018| 欧美日韩国产观看视频| 青青一区二区| 国产精品论坛| 在线观看日韩精品视频| 日本精品久久久久中文| 精品视频123区在线观看| 麻豆电影在线观看| 亚洲国产精品精华液ab| 高潮毛片7777777毛片| 国产亚洲一区二区三区在线观看| 精品国产一区二区三区噜噜噜| 男人天堂av网| 日韩精品免费在线视频| 国模叶桐国产精品一区| 狠狠88综合久久久久综合网| 毛片在线网址播放| 亚洲成人tv网| 91久久国产婷婷一区二区| 美日韩黄色片| 天天干天天舔天天射| 亚洲小视频在线| 91国产在线播放| 黄色在线资源| 小说区亚洲自拍另类图片专区| 91国自产精品中文字幕亚洲| 欧美女同在线观看| 男女h黄动漫啪啪无遮挡软件| zztt21.su黑料网站| 久久不见久久见中文字幕免费| 国产嫩bbwbbw高潮| 最新四虎影在线在永久观看www| 欧美xxxx精品| 在线观看免费播放网址成人| 久久精品视频99| 久久成人资源| av电影在线观看不卡| 成人在线视频www| 欧美日韩免费做爰视频| 老司机久久99久久精品播放免费| 91麻豆精品国产91久久久更新资源速度超快| a毛片不卡免费看片| 欧美精品一区二区久久久| 天天干人人干| 日韩在线一区二区三区免费视频| 日韩一级大片在线观看| 风间由美性色一区二区三区四区| 久久福利综合| 97视频精品| 播金莲一级淫片aaaaaaa| 少妇人妻在线视频| 国产女人被狂躁到高潮小说| 被男同事摸的水好多| 日韩av免费在线观看| 日韩中文欧美在线| 好男人www社区| 日韩欧美一区二区三区在线观看| 久久精品综合一区| 一区二区视频免费在线观看| 久久福利在线| 久久精品亚洲精品国产欧美kt∨| 国产色综合一区二区三区| 欧美激情一级精品国产| 精品国产一级毛片| 国产精品一区二区三区av| а√最新版天堂中文在线| 精品人妻一区二区色欲产成人| 日韩精品自拍偷拍| 国产美女主播视频一区| 国产精品久久久久久久天堂| 国产精品久久久久永久免费观看| 国产在线高清| 亚洲成人精品在线播放| 亚洲精品日本| 午夜精品三级视频福利| 四虎影视免费永久在线| 日韩区国产区| 亚洲GV成人无码久久精品| 91免费精品国自产拍在线不卡| www..69.hd| 国产欧美视频在线| 国产免费黄色一级片| 天堂在线资源视频| 国产精品妹子av| 99riav久久精品riav| 久久色精品视频| 欧美视频在线观看| 四虎永久精品在线| 久久久久麻豆v国产| 中文字幕五月天| 国产a√精品区二区三区四区| 一级特黄aaa大片在线观看| 国内精品久久久久久久影视蜜臀| 国产成人在线观看| 欧美精品成人在线| 亚洲精品国产91| 亚洲精品乱码久久久久久动漫| 精品乱码一区二区三区|