加入收藏 | 设为首页 | 会员中心 | 我要投稿 52刷机网 (https://www.52shuaji.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 安卓频道 > 安卓资讯 > 正文

Android实现夜间模式的方法(一)

发布时间:2017-05-19 14:11:28 所属栏目:安卓资讯 来源:www.jianshu.com
导读:版权声明:本文为博主原创文章,未经博主允许不得转载。最近整理了几篇在乐视实习时写的文章,都是一些简单的技术调研,Android夜间模式是当时做技术分享的内容,供大家参考,欢迎一起讨论~一.夜间模式的简单介绍随着人...
副标题[/!--empirenews.page--]

版权声明:本文为博主原创文章,未经博主允许不得转载。最近整理了几篇在乐视实习时写的文章,都是一些简单的技术调研,Android夜间模式是当时做技术分享的内容,供大家参考,欢迎一起讨论~一.夜间模式的简单介绍随着人...

版权声明:本文为博主原创文章,未经博主允许不得转载。最近整理了几篇在乐视实习时写的文章,都是一些简单的技术调研,Android夜间模式是当时做技术分享的内容,供大家参考,欢迎一起讨论~

一.夜间模式的简单介绍

随着人们夜间阅读的需求越来越扩大化,许多应用也都在设置中增加了“夜间模式”这个选项。关于夜间模式的实现,有很多种方法。在此介绍几种比较常见的夜间模式的实现方法。 首先,夜间模式是Android换肤的一种,如果应用中的夜间模式是多种皮肤的其中之一,则可以从apk外部加载皮肤资源,通过下载额外的apk文件,然后获取该apk文件中的资源文件。从实现难度上来讲,换肤的实现会比夜间模式更复杂些,但是实现方式思路也已经比较成熟。两个比较常见的应用的夜间模式实现效果如下:

Android实现夜间模式的方法(一)
知乎夜间模式.png
Android实现夜间模式的方法(一)
简书夜间模式.png

可以有一些APP是深蓝底色,有些则是黑色,字体一般为灰色。总体来说都要以暗色为底色,降低亮度和对比度。

二.夜间模式的实现方案——应用换肤技术

1.zip压缩包式皮肤

应用可设置一个默认路径。如果用户选择某个皮肤,则解压该皮肤.zip到这个文件夹中。该皮肤也可以自定义扩展名,但是都为zip格式(例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga)

实现技术: 该技术重点在于如何去读取zip文件中的资源以及皮肤文件存放策略。

实现方案:如果每次启动都读取SD卡上的皮肤文件,就会影响APP执行速度。最好是提供设置皮肤的界面,把用户选择的皮肤文件解压缩到皮肤路径(例如”/data/data/[package name]/skin” )下,这样不需要跨存储器读取,速度较快,而且不需要每次都去zip压缩包中读取

下面是一些关于处理zip文件的方法

    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)));               //设置压缩的注释               zipOut.setComment("comment");               //设置压缩的编码,如果要压缩的路径中有中文,就用下面的编码               zipOut.setEncoding("GBK");     //启用压缩                zipOut.setMethod(ZipOutputStream.DEFLATED);                  //压缩级别为最强压缩                 zipOut.setLevel(Deflater.BEST_COMPRESSION);                              handleDir(zipDir, this.zipOut,dirName);               this.zipOut.close();           } catch (IOException ioe) {               ioe.printStackTrace();           }       }
public void unZip(String unZipfile, String destFile) {         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 {                       // 如果指定文件的目录不存在,则创建之.                       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();           }       }
 /**      * 获得压缩文件内文件列表      *       * @param zipFile 压缩文件      * @return 压缩文件内文件名称      * @throws ZipException 压缩文件格式有误时抛出      * @throws IOException 当解压缩过程出错时抛出      */     public static ArrayList<String> getEntriesNames(File zipFile) throws ZipException, IOException {         ArrayList<String> entryNames = new ArrayList<String>();         Enumeration<?> entries = getEntriesEnumeration(zipFile);         while (entries.hasMoreElements()) {             ZipEntry entry = ((ZipEntry) entries.nextElement());             entryNames.add(new String(getEntryName(entry).getBytes("GB2312"), "8859_1"));         }         return entryNames;     }
 /**      * 获得压缩文件内压缩文件对象以取得其属性      *       * @param zipFile 压缩文件      * @return 返回一个压缩文件列表      * @throws ZipException 压缩文件格式有误时抛出      * @throws IOException IO操作有误时抛出      */     public static Enumeration<?> getEntriesEnumeration(File zipFile) throws ZipException,             IOException {         ZipFile zf = new ZipFile(zipFile);         return zf.entries();      }

(编辑:52刷机网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读