转载请注明出处,商用请与本人联系。java
本系列专题培训适用范围:初级Android程序员,即有J2SE基础和Android初级水平。J2SE基础是指掌握JAVA语法,1.五、1.6新增的语法不彻底掌握也不要紧。了解基本的面向对象思想、能编写简单的J2SE程序,掌握基本的调试方法,熟悉Swing更好。Android初级是指掌握Activity、Service、BroadcastReceiver、Intent、SQLite、UI组件的使用,能参照例子编写简单的Android应用程序。android
先看一下实现的效果:程序员
本节课程的目的:学会换肤的方案及实现,掌握不一样换肤方案的优缺点及适用场合。工具
但愿各位同窗作到:学习某一个技巧就掌握透彻,多练习。最好触类旁通、举一反三,掌握分析问题解决问题的思路和方法。布局
我讲解的是原理以及实现的关键技术点,细节、优化及与课程主题不相关的或初级的内容可能不会讲解。这是免费培训,精力有限,暂时只能作到让普通的变优秀,让优秀的变卓越。你要是已经卓越了来教教我吧。暂时不作入门培训。学习
国内有不少的软件都支持皮肤定制,这也是与国外软件重大不一样之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能,本节课程就来说解Android应用程序如何实现换肤功能。字体
软件换肤从功能上能够划分三种:优化
1) 软件内置多个皮肤,不可由用户增长或修改;ui
最低的自由度,软件实现相对于后两种最容易。spa
2) 官方提供皮肤供下载,用户可使用下载的皮肤;
用户可选择下载本身喜欢的皮肤,有些玩家会破解皮肤的定制方法,本身作皮肤使用,或者传到网上给你们用。
3) 官方提供皮肤制做工具或方法,用户可自制皮肤。
这种方式使用户有参与感,自由度较高。用户可根据本身的喜爱定制软件的皮肤。有些软件官网提供皮肤定制的工具或者方法,我建议最好有可视化带向导的工具。用户只要本身找一些图片、修改文字的字体替换就能够了。用户能够上传自制的皮肤,提供其余用户下载,还能够赚得一些虚拟货币或者奖品什么的。这种通常都是打包为.zip格式的。扩展名可由各公司自定义,有制做工具的话直接导出来最方便。
首先咱们要弄清楚换肤的定义,软件皮肤包括图标、字体、布局、交互风格等,换肤就是换掉皮肤包括的部分或全部资源。
前面提到的三种皮肤,从软件实现上来看,它们的本质区别是皮肤是否内置到应用程序中。对于内置的实现比较简单,只要在开发应用的过程当中设计几套皮肤供用户选择。这里用到的知识不超过Android基础,不详细讲解。
本节课程重点讲解如何实现皮肤与应用程序分离。
皮肤通常含有多个文件,例如图片、配置等文件,分散的文件不利于传输和使用,最好打包。打包的格式通常选择zip格式。这里分两种状况,一种是apk,例如AdwLauncher,它的桌面皮肤格式是一个apk;另外一种是自定义扩展名,例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文件格式实际上都是zip。
下面咱们分别讲解。
一.apk格式
如今的问题变成了一个应用如何读取另外一个apk中的资源。
在android系统中,apk之间能够相互读取数据的条件是:有一样的签名,而且AndroidManifest.xml文件中配置的android:sharedUserId属性值相同,那么两个apk运行在同一个进程中,能够互相访问任意数据。
方法以下:
1) 应用程序和皮肤程序的AndroidManifest.xml中配置
例如: android:sharedUserId="org.yuchen"
2) 文件与应用apk中对同一功能的皮肤文件名要一致
例如:应用程序的背景图片路径:/SkinDemo/res/drawable-hdpi/bg.png
那么皮肤apk中的背景图片文件路径也应该是:
CustomSkin/res/drawable-hdpi/bg.png
3)访问资源的方法
[java] view plaincopyprint?
Context context = createPackageContext("com.yuchen.customskin", Context.CONTEXT_IGNORE_SECURITY);
获取到org.yuchen.customskin对应的Context,经过返回的context对象就能够访问到org.yuchen.customskin中的任何资源。
例如:应用apk要得到皮肤apk中的bg.png,
[java] view plaincopyprint?
Drawable drawable = context.getResources().getDrawable(R.drawable.bg);
这样就获得了图片的引用,其余xml资源文件的获取方式也是相似的。
二.自定义扩展名的zip格式的皮肤
技术点在于如何去读取zip文件中的资源以及皮肤文件存放策略。
方案:若是软件每次启动都去读取SD卡上的皮肤文件,速度会比较慢。较好的作法是提供一个皮肤设置的界面,用户选择了哪个皮肤,就把那个皮肤文件解压缩到”/data/data/[package name]/skin”路径下,这样不须要跨存储器读取,速度较快,并且不须要每次都去zip压缩包中读取,不依赖SD卡中的文件,即便皮肤压缩包文件被删除了也没有关系。
实现方法:
1. 在软件的帮助或者官网的帮助中提示用户将皮肤文件拷贝到SD卡指定路径下。
2. 在软件中提供皮肤设置界面。能够在菜单或者在设置中。可参考墨迹、搜狗输入法、QQ等支持换肤的软件。
3. 加载指定路径下的皮肤文件,读取其中的缩略图,在皮肤设置界面中显示,将用户选中的皮肤文件解压缩到”/data/data/[package name]/skin”路径下。
4. 软件中优先读取”/data/data/[package name]/skin/”路径下的资源。若是没有则使用apk中的资源。
源代码及答疑都在QQ群中。