换皮肤

简介: 引用:http://crazier9527.iteye.com/blog/1190671 看到好多人在问题与解答里面都问怎么换肤,搜了一下论坛里面好像没怎么人弄个实例出来,所以我来了,哈哈。。下面的文字大部分是转载的,也懒得自己去打字了,文采不好。

引用:http://crazier9527.iteye.com/blog/1190671

看到好多人在问题与解答里面都问怎么换肤,搜了一下论坛里面好像没怎么人弄个实例出来,所以我来了,哈哈。。


下面的文字大部分是转载的,也懒得自己去打字了,文采不好。

转载地址:http://www.cnblogs.com/suiyc/archive/2011/05/27/2059778.html
不过没图,呵呵。。


国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能,本节课程就来讲解Android应用程序如何实现换肤功能。
软件换肤从功能上可以划分三种:
  1) 软件内置多个皮肤,不可由用户增加或修改;
    最低的自由度,软件实现相对于后两种最容易。
  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="com.kris.skin" ,值可以是做任意的,
   2) 文件与应用apk中对同一功能的皮肤文件名要一致
     例如:应用程序的背景图片路径:\SkinDemo\res\drawable-hdpi\bg.png
那么皮肤apk中的背景图片文件路径也应该是:
CustomSkin\res\drawable-hdpi\bg.png
   3)访问资源的方法

  1. Context context = createPackageContext("com.yuchen.customskin", Context.CONTEXT_IGNORE_SECURITY); 
复制代码

获取到org.yuchen.customskin对应的Context,通过返回的context对象就可以访问到org.yuchen.customskin中的任何资源。
   例如:应用apk要获得皮肤apk中的bg.png,

  1. 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中的资源。

下面是我做的实例的截图与source ,我只测试了一下通过apk 来换肤的功能 ,到少其它的方法就留给大家去实验吧,不过记得实验了也上传图来大家一起分享哟。


图来了:
换肤前的截图:
before.png 
换肤后的截图:
after.png 

工程源码来了,re_skin是主程序 ,re_skin1是皮质程序,也就是提供资源的:

 

 

 
相关文章
|
2月前
自适应可爱卡通小人404页面模板
自适应可爱卡通小人404页面模板
30 12
自适应可爱卡通小人404页面模板
|
6月前
|
设计模式 Java
【3D机甲】捏造型功能
【3D机甲】捏造型功能
|
9月前
|
数据安全/隐私保护
推荐五个好用的小软件,放大快乐,缩小悲伤
分享是一种力量,它能放大快乐,它能缩小悲伤,我喜欢分享一些好用的软件给大家,今天也要继续这个习惯,为大家介绍五个好用的小软件。
76 0
|
11月前
|
IDE 编译器 开发工具
|
Java 计算机视觉 Python
opencv换照片底色
opencv换照片底色
174 0
不要挡住我,我要去上面
这一节里,我们要学习精灵层级的管理。概念非常的直观,而且操作起来也很简单。
107 0
不要挡住我,我要去上面
|
机器人 人机交互 图形学
DIY一只“眼睛”摄像头看自己工作,能眨眼睛皱眉头,还能“撸”
DIY一只“眼睛”摄像头看自己工作,能眨眼睛皱眉头,还能“撸”
183 0
|
机器学习/深度学习 安全 Android开发
搞颜色指南|巧用色彩搭配,制作吸睛网站。
建站|全网最系统的色彩搭配指南,教你制作吸睛网站
352 0
|
图形学
Unity 捏脸整理及基于骨骼的捏脸功能实现
目前实现捏脸功能的方式主要有两种。一个是Blendshape(融合变形),一个是基于骨骼驱动的方式,通过修改骨骼矩阵(bindpose)来影响SkinMesh。这两种方式的最终原理都是在shader 生效之前修改顶点。
4073 0
添加到界面前获取尺寸
原文:添加到界面前获取尺寸 You have few options you can do this, forcing to call Window.Measure and Window.Arrange will make all values to be calculated, or you can get those values in the Window.
596 0