Android应用切换皮肤功能实现

原文地址:http://www.eoeandroid.com/thread-318159-1-1.html


现在大多数android应用都支持切换皮肤的功能。比如千千静听,墨迹天气等等。本文介绍两种切换皮肤的方法。

1.第一种是通过安装皮肤apk的方式。

当安装了皮肤apk包之后,主程序只需要读取皮肤apk包里的图片资源。就可以实现切换皮肤了。

要获取apk皮肤包里的图片资源,需要获取到皮肤apk包的上下文Context.

[mw_shl_code=java,true]  try {
   currentContext = context.createPackageContext(
   packageName, //packageName是对应皮肤apk包的包名。
   Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);
   
   } catch(Exception e) {
   e.printStackTrace();
   }[/mw_shl_code]

图片资源的名字和位置要一致。好比如整个界面的背景mainbg.jpg,在主程序和皮肤包apk的位置都在res\drawable-hdpi\mainbg.jpg.下。

然后通过下面这个方法:

[mw_shl_code=java,true]  public static Drawable getDrawable(Context context,String drawableName) throws NotFoundException {
   Drawable resultDrawable =null;
   Context ct =getSkinContext(context);
   try{
   int resid=getIdentifier2(ct,drawableName.trim(),"drawable");
   if(resid == 0){ 
   resid=getIdentifier2(context,drawableName.trim(),"drawable");
   resultDrawable=context.getResources().getDrawable(resid);
   }else{
   resultDrawable=ct.getResources().getDrawable(resid);
   }
   }catch(Exception e){
   e.printStackTrace();
   
   }
   return resultDrawable;
   }[/mw_shl_code]

就可以获取到对应的皮肤资源。

可以看到,首先是根据通过下面这个方法,获取到对应资源的id,然后再更加id获取到对应的图片资源。

[mw_shl_code=java,true]  public static int getIdentifier2(Context context,String name,String defType) throws NotFoundException{
   int result=0;
   try{
   result = context.getResources().getIdentifier(name, defType, context.getPackageName());
   }catch(Exception e){
   e.printStackTrace();
   
   }
   return result;
   }[/mw_shl_code]

然后再设置对应控件的drawable.就实现了切换皮肤。

因为皮肤apk包的上下文经常用到,因此我用一个静态变量保存了起来。假如在皮肤包apk里找不到对应的图片资源,就在主程序的图片资源里找,不至于图片找不到,让界面空白。

2.第二种方式是把所有图片资源放到一起,打成一个压缩包。应用的时候把图片解压到sd卡或者是应用的data目录下。

通过下面方法,得到图片资源的Drawable。在把Drawable 设置到控件上。

[mw_shl_code=java,true]public static Drawable createDrawableByPath(Context context,String imagePath){
try {

if(StringUtils.isNull(imagePath))return null;

Bitmap bm = BitmapFactory.decodeFile(imagePath);

bm.setDensity(context.getResources().getDisplayMetrics().DENSITY_HIGH);

Drawable dw = new BitmapDrawable(context.getResources(), bm);

return dw;

} catch (Exception e) { 
e.printStackTrace();
}catch (OutOfMemoryError ex) {
System.gc();
ex.printStackTrace(); 

return null;
}[/mw_shl_code]

因为sd卡有时候会加载不成功。或者是根本没有sd卡。所有我把图片的压缩包直接解压到了

context.getFilesDir().getPath() + File.separator + "skin"+ File.separator下。

主程序只实现一个简单的换肤功能。就只有两个界面,一个是主界面,它的背景显示一个背景,就是各个皮肤。另外一个是设置皮肤界面。

点击后就到了设置皮肤的界面:

另外两个皮肤工程分别是晴天皮肤和夜晚皮肤。这两个工程非常简单,其实根本不需要activity。只需要把图片mainbg.jpg放到res\drawable-hdpi\mainbg.jpg.下。

另外两个闪电皮肤zip包和大雪皮肤zip包,我已经放到了主程序里。点击按钮就解压。

当然举例子少不了苍老师,呵呵。

当点击苍老师皮肤zip时,会模拟从网络下载zip包实现切换皮肤。

[mw_shl_code=java,true]  mProgressDialog = ProgressDialog.show(SetSkinActivity.this,
   "", 
   "正在下载苍老师...", true, false);
   
   handler.postDelayed(new Runnable() {
   
   @Override
   public void run() {
   try {
   mProgressDialog.cancel();
   Toast.makeText(SetSkinActivity.this, "苍老师下载完毕!", Toast.LENGTH_LONG).show();
   
   
   ZipUtil.unZip(getAssets().open("cang.zip"), 
   Constant.SKIN_DIR+"cang.zip", Constant.SKIN_DIR);
   
   Constant.setAppSkin(SetSkinActivity.this, SetSkinActivity.this.getPackageName());
   restartMain();
   
   } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
   
   }
   }, 3000);
   [/mw_shl_code]

换肤效果:

最后是源码:

Android加密皮肤

<ignore_js_op>


2.0.zip

6.5 MB, 下载次数: 137

时间: 2024-10-31 13:25:33

Android应用切换皮肤功能实现的相关文章

Android应用切换皮肤功能实现(二)

原文地址http://www.apkbus.com/forum.php?mod=viewthread&tid=149034&highlight=%E7%9A%AE%E8%82%A4 上次写完应用切换皮肤功能实现的时候,有网友提了些问题.我觉得上次说的还不够详细吧.现在接着再写详细点.这次再在布局里增加了三个按钮图片的设置和一个字体颜色的设置.1.其实上次只是讲到了切换皮肤时,只是替换了图片资源,其实连布局都可以切换.当然布局的切换要是apk类型的皮肤包才行.首先我们写好3个布局,把三个按钮

apk分享: Android应用更换皮肤功能的实现思路教程。

Android 的发展确实太快了,每年的都有很多新东西出现,想要覆盖所有新东西感觉也不太可能,我这里主要说一下主要的 Android 的主要新技术发展,其实了解 Android 的发展趋势,可能对开发者更有帮助. 开发工具 Android Studio: Google 官方放弃 Eclipse 和 Android Studio 普及.AS 虽然不算新,但是对 Android Studio 这个软件的更新速度快的惊人,有大量的新功能发布.例如支持很多注解代码提示注解.Live code templ

Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)

首先来个最简单的一键切换主题功能,就做个白天和晚上的主题好了. 先看我们的styles文件: 1 <resources> 2 3 <!-- Base application theme. --> 4 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 5 <!-- Customize your theme here. --> 6 &l

jQuery实现无刷新切换主题皮肤功能

jQuery实现无刷新切换主题皮肤功能 helloweba.com 作者:月光光 时间:2010-12-13 12:49 主题皮肤切换功能在很多网站和系统中应用,用户可以根据此功能设置自己喜欢的主题颜色风格,增强了用户体验.本文将围绕如何使用jQuery实现点击无刷新切换主题皮肤功能. 查看演示 实现该功能的原理就是通过点击定义的主题样式,改变页面当前引用的主题CSS文件,并且将当前的主题样式写入cookie中或者写入数据库中,以便下次该用户重新访问页面时,调用的就是上次设置好的主题样式. 准备

Android实现换肤功能(二)

前两天写的上章关于换肤的功能获得了很好的反响,今天为大家介绍另一种方式.今天实现的策略也是网友建议的,然后我自己去写了个demo,大家自己评估下相比第一种方式的优势和劣势在哪里. 简单介绍下关于第一种关于换肤实现的方法一些不友好的地方,比如点击了换肤的功能键,需要先下载一个资源apk,然后再去引用其中的资源ID,于用户使用起来确实有有很多不便之处.今天为大家介绍的方法是克服了这一弊端的,可以实现直接在应用内切换,把资源文件存储在本地apk的,读取和操作也是更加便捷的,下面介绍下大致的一个实现逻辑

iOS实用技巧 - 简易实现多皮肤功能

前言:不记得谁说的了,中国的用户大概是世界上最喜欢多皮肤功能的用户了.我很讨厌写安卓程序,图形界面设计工具及其难用,还不如手写,编辑器慢如蜗牛,智能提示总是跟不上我输入的速度,相同的功能,安卓的代码量至少是iOS的三倍,每写一行代码,都觉得自己的手指在滴血.可是安卓灵活统一的style功能确实很贴心!5之前,iOS平台上实现相同的功能一直没有个比较好的办法. iOS5之后,苹果将所有界面组件的设定,都绑定在一个叫UIAppearance的协议上了,你可以简单的通过UIAppearance设定组件

Android边沿切换效果(支持无缝过渡)

Android边沿切换效果(无缝过渡),StackPagerLayout支持像翻书一样的边沿滑动,继承于AdapterView,实现了控件的复用功能 效果 GItHub地址: https://github.com/FeiMo1988/StackPagerLayout StackPagerLayout.java: reloadAndSmoothMoveNext()//重新load下一个view,并平滑过度到该view movePre()//前移 moveNext()//后移 smoothMoveT

Android实现换肤功能(一)

上周有个朋友给建议说讲讲换肤吧,真巧这周公司的工作安排也有这个需求,换的地方之多之繁,让人伤神死了.正所谓磨刀不误砍柴工,先磨下刀,抽出一个工具类,写了个关于换肤的简单demo. Android中换肤的实现有几种方法,我使用的是读取共享进程空间另一apk中的资源的方法.大致的原理如下,让你的app和一个只有资源文件的app运行在同一进程中,这样你的app就可以访问另一app的资源了.原理很简单,下面我们分步骤讲解实现过程. 一.共享进程运行的空间 通过在两个工程下的manifest根节点添加相同

【转】为Android应用添加搜索功能

为Android应用添加搜索功能 为Android应用增加搜索功能:增加搜索建议