Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述

Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤。系统不提供直接支持,只能自行研究。

换肤,可以认为是动态替换资源(文字、颜色、字体大小、图片、布局文件……)。这个使用编程语言来动态设置是可以做到的,例如使用View的setBackgroundResource、setTextSize、setTextColor等函数。但我们不可能在每个activity里对页面里的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护、扩展,也违背了UI和代码分离的原则(android开发中UI以xml文件的方式布局)。 通常,皮肤资源会在主程序apk之外提供,以减少主程序的大小,以及方便随时提供新的皮肤扩展。

简单的来说,软件皮肤包括图标、字体、布局、交互风格等,换肤就是换掉皮肤包括的部分或所有资源。

 

主流应用程序换肤方式:

国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能. 在写这个换肤系列之前,我也参考了其他人的一些总结. 知识点比较散,因此我对其进行了整理和进一步的优化和扩展. 当然,由于精力有限,部分换肤方式我也只写了主体功能的实现. 如果出现有误或者不够详细的地方,希望大家提出意见或者自行进行扩展.

关于其中提到的几种主流实现方式,接下来的文章里我会具体提供代码进行解释, 此次先做一个整体的概述.

目前主流的换肤从功能上可以划分几种实现方式,

  1) 软件内置多个皮肤,不可由用户增加或修改:

最低的自由度,软件实现相对于后面的几种相对简单.

如果你的程序和资源都很小,可以在主程序apk中放入足够的皮肤资源.

典型应用:平板电脑Apad上QQ空间的换肤功能,实际上只是改变了Activity的背景,或这部分的资源.

  2) 官方提供皮肤供下载,用户可以使用下载的皮肤:

    用户可选择下载自己喜欢的皮肤,有些玩家会破解皮肤的定制方法,自己做皮肤使用,或者传到网上给大家用。

典型应用: 墨迹天气下载的皮肤就是一个zip格式的压缩包,在应用的时候把皮肤资源释放到墨迹天气应用的目录下,更换皮肤时新的皮肤资源会替换掉老的皮肤资源每次加载的时候就是从手机硬盘上读取图片,这些图片资源的命名和程序中的资源的命名保持一致,一旦找不到这些资源,可以选择到系统默认中查找。

这种实现是直接读取了外部资源文件,在程序运行时通过代码显示的替换界面的背景资源。

这种方式的优点是:皮肤资源的格式定义很随意可以是zip也可以是自定义的格式,只要程序中能够解析到资源就行,缺点是需要读取并解析文件,导致效率上会比较差.

3) 皮肤资源存在于主程序之类的APK中,即实现了APK的拆分. 这里类似于浏览器与插件的关系. 当考虑应用程序需要扩展时,则需要采用本方式实现.,这不仅仅体现在换肤的APK中.

典型应用: 手机QQ换肤的实现方式

QQ的皮肤是一个无界面APK应用,这个皮肤应用中的资源和主程序的资源命名一致,通过主程序和皮肤程序共享进程实现主程序对皮肤程序中资源的访问,在程序运行时通过代码显示指定皮肤资源,缺点是在主程序中每个activity要增加复杂的使用哪种皮肤逻辑,优点是效率比较快,且使应用程序具有了良好的扩展性,降低了程序的耦合性. 包括其他类似的扩展功能,都可以利用此方式实现.

  4) 官方提供皮肤制作工具或方法,用户可自制皮肤:

大致分为两种情况:

1. 应用程序主列表为一个GridView,用户可通过在设置中选择背景的颜色和按钮的风格. 直接进行替换即可.

2. 另外一种是有可视化带向导的工具。用户只要自己找一些图片、修改文字的字体替换就可以了。用户可以上传自制的皮肤,提供其他用户下载. 一般都是打包为.zip格式的,扩展名可由公司需求自定义. 例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文件格式实际上都是zip。之后的应用就和第二种换肤方式类似了.

这种方式优点是:使用户有参与感,自由度较高。用户可根据自己的喜好定制软件的皮肤。

 

     5) 改写SDK的Resource类:

在今年二月二十九号的CMDN的一个活动上小米MIUI系统工程师董红光发表了Android系统MIUI底层换肤技术的主题演讲,提到了小米主题更换是改写SDK的  Resource类,这种方式需要熟悉Android系统的FrameWork层,因此实现比较复杂,花费较大的精力进行研究.

此处提供一些思路:

在Android系统中,资源主要指图片和MP3类型的文件,也是用户UI包含的所有元素。谷歌在设计Android系统时,将UI界面和逻辑代码分开组建:界面设计通过XML的形式描述,具体的程序和应用逻辑则通过代码来实现;前端工程师只负责HTML和CSS的设计与架构,后端工程师则专门考虑JSP和Java的代码执行.

资源访问在Android性能架构中处于何种地位?在进行Android开发时,开发者经常用到Framework提供的资源包Framework.jar与Framework-res.apk,以及与核心资源相关的组件“Resource Manager”文件系统。

APK本身是一个简单的文件格式,也是一个压缩文件包。通过解压文件包可以释放APK文件:首先需要APK的原数据Meta INF、Manifest以及RES目录。一部分包含图片资源的应用,在资源释放时也会用到Layout。

在安装文件时,系统会将文件取出、解压后放在Dalvik Cache中。该缓存下有许多dex文件,当用户打开应用时系统会自动加载相应的类。在加载过程中,系统如需访问APK,则需对其进行解压,这样通常导致效率较为低下。而如果将dex文件放入Dalvik Cache中,则能够令加载的效率大大提升。

每个进程都有一份关于Framework的共享类和共享资源,但物理内存空间中的系统级别资源只有一份。Framework类和资源是只读的,而Android操作系统设计之初并没有硬盘的虚拟内存和换进换出机制,所以节省内存空间是非常重要的工作。

此活动具体情况介绍请见如下地址:

http://www.csdn.net/article/2012-03-01/312643

时间: 2024-10-31 06:11:23

Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述的相关文章

Android 打造自己的个性化应用(四):仿墨迹天气实现-->自定义扩展名的zip格式的皮肤

在这里谈一下墨迹天气的换肤实现方式,不过首先声明我只是通过反编译以及参考了一些网上其他资料的方式推测出的换肤原理, 在这里只供参考. 若大家有更好的方式, 欢迎交流. 墨迹天气下载的皮肤就是一个zip格式的压缩包,在应用的时候把皮肤资源释放到墨迹天气应用的目录下,更换皮肤时新的皮肤资源会替换掉老的皮肤资源每次加载的时候就是从手机硬盘上读取图片,这些图片资源的命名和程序中的资源的命名保持一致,一旦找不到这些资源,可以选择到系统默认中查找.这种实现是直接读取了外部资源文件,在程序运行时通过代码显示的

Android 打造自己的个性化应用(三):应用程序的插件化

在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度. 由于linux平台的安全机制,再加上dalvik的特殊机制,各种权限壁垒,使得开发一个灵活多变的程序,变得比较困难,不像pc平台下那么容易. 这里实际上可以借鉴传统软件中扩展程序的方法: 也就是插件的实现. 如目前所有的浏览器,比如我们使用的eclipse,以及很多优秀的软件,都使用了此种方式. 这样轻松实现了软件的功能扩展,而升级功能时只用更新对应插件, 而不是需要更新整个应用,降低了程序的

Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压

上一篇中提到对于Zip包的解压和压缩需要借助Ant 实现,我经过参考了其他的资料,整理后并加上了一些自己的看法: 这里就具体地讲下如何使用Ant进行解压缩及其原因: java中实际是提供了对  zip等压缩格式的支持,但是为什么这里会用到ant呢?   原因主要有两个: 1. java提供的类对于包括有中文字符的路径,文件名支持不够好,你用其它第三方软件解压的时候就会存在乱码.而ant.jar就支持文件名或者路径包括中文字符. 2. ant.jar提供了强大的工具类,更加方便于我们对压缩与解压的

【Android-View】浅谈Android换肤的几种实现方式

Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片.布局文件……).这个使用编程语言来动态设置是可以做到的,例如使用View的 setBackgroundResource.setTextSize.setTextColor等函数.但我们不可能在每个activity里对页面里 的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护.扩展,也违背了UI

Android打造通用的下拉刷新组件

还记得上一篇 blog 的内容吗?如果不记得建议先去了解一下,Android 事件处理全面剖析 ,因为下拉刷新需要用到手势的处理,而上一篇文章中,对事件处理做了很详细的说明,了解了事件的处理机制,对理解本篇文章有很大的帮助.好了,这里就当大家都已经对事件处理有了一定的了解,开始我们的下拉刷新征程. 还是老规矩,先上效果图,再根据效果图来分析实现的原理: 一 .分析原理 我们都知道,listView 控件为我们提供了 addHeaderView.和 addFootView 的方法,我们通过此方法可

Android打造不一样的新手引导页面(一)

Android打造不一样的新手引导页面(一) 本系列主要分为两篇博客 打造不一样的新手引导页面(一) Android打造不一样的新手引导页面(二) 关于页面导航器的,可以查看我的这一篇博客仿网易新闻的顶部导航指示器 本篇博客主要讲解怎样自定义一个circleIndicator控件? 下一遍博客主要讲解怎样更改ViewPager切换的效果, 预计明天晚上之前更新. 效果图如下 1)首先我们先来看一下要怎样使用我们的circleIndicator控件 其实很简单,值需要两个步骤 1) 在xml布局文

Android中插件开发篇之----应用换肤原理解析

一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转战: http://blog.csdn.net/jiangwei0910410003/article/details/41384667 二.原理介绍 现在市场上有很多应用都有换肤的功能,就是能够提供给用户一些皮肤包,然后下载,替换.而且有些皮肤是要收费的.对于这个功能的话,其实没有什么技术难度的,但

200行代码打造超越一线互联网公司的换肤架构

本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: 网易云QQ的换肤是怎么做到的,你对换肤有了解吗?看过换肤的原理没? 心理分析:没有接触过换肤技术 第一次听到该名词肯定会很茫然.面试官考的是对资源加载,监听布局,有没有了解.本文从换肤实战一对一讲解.告诉你如何做以及实现.文章末尾带换肤项目源码 求职者: 从监听布局开始到 换肤原理,详细给面试官讲解换肤的原理 接下来我们一起分享这篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需Activity的重

Android换肤技术总结

原文出处: http://blog.zhaiyifan.cn/2015/09/10/Android%E6%8D%A2%E8%82%A4%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93/ 背景 纵观现在各种Android app,其换肤需求可以归为 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如QQ/QQ空间. 对于第一种来说,目测应该是直接通过本地theme来做的,即所有图片/