Android实现换肤的两种思路分析

本文分析了Android实现换肤的两种思路。分享给大家供大家参考,具体如下:

这里来了解换肤实现及不同方案的差异和使用场合。

一、从功能上划分

1) 软件内置多个皮肤,用户不能修改;

2) 官方提供皮肤下载,用户使用下载的皮肤;

3) 官方提供皮肤制作工具或方法,用户自制皮肤。

二、皮肤定义

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

三、皮肤与APP分离

1)打包皮肤文件

默认格式是apk。例如Launcher,它的桌面皮肤格式是一个apk;

自定义的格式为zip。例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文件格式实际上都是zip。

四、资源访问

1)apk格式

apk之间读取数据的条件是:有相同签名并且AndroidManifest.xml中配置android:sharedUserId有相同的属性值,这样两个apk运行在同一个进程中,就能互相访问数据了。

方法如下:

a) 应用程序和皮肤程序的AndroidManifest.xml中配置

例如:

代码如下:

android:sharedUserId="com.zj"

b) 文件与应用apk中对同一功能的皮肤文件名要一致

例如:应用程序的背景图片路径:\Skin\res\drawable-hdpi\XX.png

那么皮肤apk中的背景图片文件路径也应该是:Skin\res\drawable-hdpi\XX.png

c)访问资源的方法

代码如下:

Context context = createPackageContext("com.zj.skin", Context.CONTEXT_IGNORE_SECURITY);

获取到com.zj.skin对应的Context,通过返回的context对象就可以访问到com.zj.skin中的任何资源。

例如:应用apk要获得皮肤apk中的bg.png,

代码如下:

Drawable drawable = context.getResources().getDrawable(R.drawable.bg);

这样就得到了图片的引用,其他xml资源文件的获取方式也是类似的。

2)自定义扩展名的zip格式的皮肤

重点:读取zip文件中的资源以及皮肤文件存放策略。

方案:如果每次启动都读取SD卡上的皮肤文件,就会影响APP执行速度。最好是提供设置皮肤的界面,把用户选择的皮肤文件解压缩到皮肤路径下,这样不需要跨存储器读取,速度较快,而且不需要每次都去zip压缩包中读取,不依赖SD卡中的文件,就算皮肤压缩包被删除了也不会影响。

实现方法:

a) 在软件的帮助或者官网的帮助中提示用户将皮肤文件拷贝到SD卡指定路径下。

b) 在软件中提供皮肤设置界面。可以在菜单或者在设置中。可参考墨迹、搜狗输入法、QQ等支持换肤的软件。

c) 加载指定路径下的皮肤文件,读取其中的缩略图,在皮肤设置界面中显示,将用户选中的皮肤文件解压缩到皮肤路径下。

d) APP优先读取皮肤路径下的资源。如果没有则使用apk中的资源。

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android编程实现换肤功能实例

    本文实例讲述了Android编程实现换肤功能的方法.分享给大家供大家参考,具体如下: 本系列专题培训适用范围:初级Android程序员,即有J2SE基础和Android初级水平.J2SE基础是指掌握JAVA语法,1.5.1.6新增的语法不完全掌握也没关系.了解基本的面向对象思想.能编写简单的J2SE程序,掌握基本的调试方法,熟悉Swing更好.Android初级是指掌握Activity.Service.BroadcastReceiver.Intent.SQLite.UI组件的使用,能参照例子编写

  • Android应用开发中实现apk皮肤文件换肤的思路分析

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

  • 分析Android App中内置换肤功能的实现方式

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

  • android换肤功能 如何动态获取控件中背景图片的资源id?

    这个是在在做一个换肤功能时遇到的问题. 对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛).这个换肤的方案原理就是,自身应用的资源名称是R.drawable.background,那皮肤包中应该也是这个名称,然后通过这个名称获取该资源在皮肤包中的具体id,代码: //先获取本地资源引用名称,type name是R.drawable.background中的"drawable"

  • Android 换肤技术资料整理

    Android换肤技术总结 背景 纵观现在各种Android app,其换肤需求可以归为 - 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. - 多种主题切换,通常为会员特权,如QQ/QQ空间. 对于第一种来说,目测应该是直接通过本地theme来做的,即所有图片/颜色的资源都在apk里面打包了. 而对于第二种,则相对复杂一些,由于作为一种线上服务,可能上架新皮肤,且那么多皮肤包放在apk里面实在太占体积了,所以皮肤资源会在选择后再进行

  • Android实现换肤的两种思路分析

    本文分析了Android实现换肤的两种思路.分享给大家供大家参考,具体如下: 这里来了解换肤实现及不同方案的差异和使用场合. 一.从功能上划分 1) 软件内置多个皮肤,用户不能修改: 2) 官方提供皮肤下载,用户使用下载的皮肤: 3) 官方提供皮肤制作工具或方法,用户自制皮肤. 二.皮肤定义 软件皮肤包括图标.字体.布局.交互风格等,换肤就是换掉皮肤包括的部分或所有资源. 三.皮肤与APP分离 1)打包皮肤文件 默认格式是apk.例如Launcher,它的桌面皮肤格式是一个apk: 自定义的格式

  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法.分享给大家供大家参考,具体如下: 在Android中,音频.视频等多媒体元素的加入,使得应用程序的用户体验更好.可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐.办公的必备产品. Android提供了简单的音频API.一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具.这种工具在互联网上有大量的实例,因此在此只做简单的介绍. 对播放行为的控制是三个大家非常熟悉的方法:start().stop()和paus

  • Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Canvas constructor错误 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.apple).copy(Bi

  • android绘制圆形图片的两种方式示例

    android绘制圆形图片的两种方式 看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap当做一种颜色 设置给paint ,paint都已经有颜色了 你想让它方了,圆了,扁了 还不是看你心情 canvas调用那个方法咯 实现的大致思路如下: 1. 创建一个类 继承imageView 重写onDraw() 2. 获取到bitmap图片 3. 计算图片的

  • 微信小程序换肤功能实现代码(思路详解)

    在手机.电脑使用频率如此高的当下,应用可以更换皮肤,以提升美观性,并减轻屏幕对眼睛的刺激,无疑对用户体验有很大的帮助 实现功能 要实现如上更换皮肤的效果,有几个思路: 1.准备皮肤相关的wxss,引入到app.wxss中,方便每个页面使用: 2.设置皮肤时,动态改变wxml中元素的类名或id,使页面应用对应的皮肤: 3.将选中皮肤的值保存在小程序本地缓存中,保证其他页面及下一次打开小程序时,页面展示正确的皮肤: 下面介绍一些实现的细节 wxml <view class="page"

  • Android时分秒计时器的两种实现方法

    可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲述一下了. <Chronometer android:layout_width="wrap_content" android:layout_height="wrap_content" android:format="%s" android:id

  • Android 手机防止休眠的两种实现方法

    Android 手机防止休眠的两种实现方法 实现这一功能的方法有两种, 一种是在Manifest.xml文件里面声明. 一种是在代码里面修改LayoutParams的标志位. 具体如下: 1.在Manifest.xml文件里面用user-permission声明.代码如下: < uses-permission android:name="android.permission.WAKE_LOCK" > < /uses-permission > 这种方法,在安装ap

  • Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

  • Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView. 布局main.xml: <?xml version="1.0&qu

  • 使用android studio导入模块的两种方法(超详细)

    第一种方法 1,首先自己创建一个新的android项目,选择Empty Activity,一直选择默认项 2,file->new->import module 3.选择模块文件,点击finish 4.点击file->project Structure, 5,选中Modules下的app,注意这个app就是你自己new project的module,下面这个huyubao就是我之前添加的,再选择Dependencies 6.点击+号,选中Module dependency 7,选中之前导入

随机推荐