动态换肤在很多android应用中都有使用,用户根据自己的喜好设置皮肤主题,可以增强用户使用应用的舒适度。
Android换肤可以分为很多种,它们从使用方式,用户体验以及项目框架设计上体现了明显的差异。
接下来几篇文章分别讲解其中比较主流的换肤方式。

应用内置皮肤实现动态切换在技术上是最容易实现的,但有很多局限性,比如不能在使用过程中增减皮肤,除非升级应用,扩展性很弱;如果需要设置皮肤的位置很多,编码起来比较麻烦。主要是使用 SharedPreferences记录当前设置的皮肤序号,然后加载这套皮肤的所有资源,在每个activity中有一个setSkin()的方法设置皮肤。
博主的个人项目好记单词 中的换肤功能就是使用这个方案,感兴趣可以下载看一看,效果还不错。

实现:

  • 确定需要换肤的地方
    首先要确定应用中那些界面需要换肤,他们有什么共性?比如天天动听,一套以蓝色为基调的皮肤,所有的界面title应该是蓝色的,所有的按钮也是蓝色系列的…,这样就可以确定一套皮肤需要哪些颜色以及资源文件。

  • 确定一套皮肤需要的资源(其余皮肤按照第一套皮肤模板做)
    比如首页,四个模块,其中 本地音乐最近播放 的颜色是一样的,这里需要两个颜色值(正常和按下状态),歌曲下载MV下载 的颜色是一样的,这里也需要两个颜色值,每个界面的标题背景色相同,然后一些按钮也需要两个颜色值;综合起来就需要7个色值,在color.xml文件中定义好它们,然后再drawable目录定义好选择器。
    (以下是Demo中的代码片段,真实项目开发中只需要按照这个步骤模板做就行)

<?xml version="1.0" encoding="utf-8"?>
<resources><!-- 皮肤1 主色调 天蓝#4AC2E3--><!-- 界面背景 --><color name="pf1_activity_bg_color1">#46BAE3</color><color name="pf1_activity_bg_color2">#63f3e3</color><!-- item选择器 --><color name="pf1_main_item_bg1">#50CEE3</color>            <color name="pf1_main_item_bg2">#4AC2E3</color><!-- 字体颜色黑色 --><color name="pf1_text_color">#000000</color>               <!-- 皮肤2 主色调 草绿#53CAC3--><!-- 界面背景 --><color name="pf2_activity_bg_color1">#53CAC3</color>       <color name="pf2_activity_bg_color2">#73FFB9</color><!-- item选择器 --><color name="pf2_main_item_bg1">#62E3BE</color>            <color name="pf2_main_item_bg2">#5BD7C0</color><!-- 字体颜色白色 --><color name="pf2_text_color">#ffffff</color>
</resources>

  • 编写SkinUtil资源加载类
public class SkinUtil {private SharedPreferences sp;//KEYprivate final String KEY_PF = "skin";  //记录当前皮肤//VALUEpublic static final int VALUE_SKIN_1 = 1;   //天蓝public static final int VALUE_SKIN_2 = 2;   //草绿//当前皮肤资源IDpublic int activity_bg;public int item_bg;public int textColor;public SkinUtil(Context context){sp = context.getSharedPreferences("mySkin", Context.MODE_PRIVATE); loadPf();}/*** 设置使用那一套皮肤* @param witch*/public void setSkin(int witch){sp.edit().putInt(KEY_PF, witch).commit();loadPf();}/*** 加载皮肤资源*/public void loadPf(){//默认第一套皮肤(如果没有设置过)int pf_num =  sp.getInt(KEY_PF, VALUE_SKIN_1);switch (pf_num) {case VALUE_SKIN_1:setSkin1();break;case VALUE_SKIN_2:setSkin2();break;}}//加载第一套皮肤资源IDprivate void setSkin1() {activity_bg = R.drawable.skin1_activity_bg;item_bg = R.drawable.skin1_main_item_bg;textColor = R.color.pf1_text_color;}//加载第二套皮肤资源IDprivate void setSkin2() {activity_bg = R.drawable.skin2_activity_bg;item_bg = R.drawable.skin2_main_item_bg;textColor = R.color.pf2_text_color;}
}
  • 使用皮肤
    在Application中初始化皮肤工具类
public class MyApplication extends Application {public static SkinUtil skin;@Overridepublic void onCreate() {super.onCreate();skin = new SkinUtil(getApplicationContext());}
}

定义BaseActivity

public abstract class BaseActivity extends Activity implements OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initView();setSkin();}protected abstract void initView();protected abstract void setSkin();
}

实现setSkin()方法设置皮肤

public class MainActivity extends BaseActivity{private LinearLayout ll_bg;private TextView tv_skin1, tv_skin2;@Overrideprotected void initView() {setContentView(R.layout.activity_main);ll_bg = (LinearLayout) findViewById(R.id.ll_bg);...}protected void setSkin() {ll_bg.setBackgroundResource(MyApplication.skin.activity_bg);...}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_skin1://使用第一套皮肤MyApplication.skin.setSkin(SkinUtil.VALUE_SKIN_1);setSkin();break;case R.id.tv_skin2://使用第二套皮肤MyApplication.skin.setSkin(SkinUtil.VALUE_SKIN_2);setSkin();break;...}}
}

源码下载

https://github.com/openXu/SkinChange1

Android动态换肤(一、应用内置多套皮肤)相关推荐

  1. android 状态栏 背景色_技术一面:说说Android动态换肤实现原理

    换肤分为动态换肤和静态换肤 静态换肤 这种换肤的方式,也就是我们所说的内置换肤,就是在APP内部放置多套相同的资源.进行资源的切换. 这种换肤的方式有很多缺点,比如, 灵活性差,只能更换内置的资源.a ...

  2. Android 动态换肤技术原理 | 实践 及总结

    实现的效果图 动态换肤一般实现的原理 对页面需要换肤的View进行标记 在Activity#setContentView()加载view时获取到标记的view(后面会说是要怎么获取到) 创建一个Lib ...

  3. android 动态换肤框架,GitHub - ss520k/Android-Skin-Loader: 一个通过动态加载本地皮肤包进行换肤的皮肤框架...

    Android-Skin-Loader 更新日志 导入到Android Studio,使用gradle构建皮肤包(见7. 皮肤包是什么?如何生成?)(2015-12-02) 解决Fragment换肤在 ...

  4. android换肤动画,Android动态换肤框架-实现换肤

    1.换肤流程 1 2.采集流程 2 3.Android资源查找流程 3 4.采集需要换肤的控件 换肤我们需要换所有可能需要换的页面控件,所以我们不可能在每个页面重新findviewById,这时就需要 ...

  5. 真香定律!Android动态换肤实现原理解析,原理+实战+视频+源码

    自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils.DbUtils.ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的.最近决定研究一下xUtils的 ...

  6. android布局优化!Android动态换肤实现原理解析,灵魂拷问

    " 对于程序员来说,如果哪一天开始他停止了学习,那么他的职业生涯便开始宣告消亡." 高薪的IT行业是众多年轻人的职业梦想,然而,一旦身入其中却发觉没有想像中那么美好.被称为IT蓝领 ...

  7. Android动态换肤实现原理解析,原理+实战+视频+源码

    前言 本人今年25岁,毕业之后进入一家小型的互联网公司工作,在这原公司呆了3年,直至今年才有了跳槽的想法. 每个程序员 都拥有大厂梦,我也不例外,在小公司待久了,感觉人会荒废掉,太轻松,没有压迫感.因 ...

  8. android视频编辑sdk!Android动态换肤实现原理解析,灵魂拷问

    " 对于程序员来说,如果哪一天开始他停止了学习,那么他的职业生涯便开始宣告消亡." 高薪的IT行业是众多年轻人的职业梦想,然而,一旦身入其中却发觉没有想像中那么美好.被称为IT蓝领 ...

  9. 安卓app开发教程!Android动态换肤实现原理解析,值得收藏!

    开头 Android开发,假如开始没有任何的开发经验的话, 千万不要着急,不要想着在短时间内就把一个语言学习好, 因为你之前没有任何的学习经验, 在这个过程中需要有耐心地学习完JAVA的基础知识, 然 ...

最新文章

  1. 起飞,会了这4个 Intellij IDEA 调试魔法,阅读源码都简单了
  2. 基于EEG/EMG/EOG的多模态人机接口,实时控制软机器人手
  3. Windows 中 SQLite3 使用(1) -- 配置
  4. 博士面试被拒,只因第一学历非985、211...
  5. unity 纹理压缩格式‘_纹理优化:让你的纹理也“瘦”下来
  6. mybatis那些事~
  7. Linux基础学习七:mysql的安装和配置教程
  8. TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
  9. 队列的基本操作c语言代码大全,数据结构――队列(循环队列)的基本操作(实现链队列逐一取出c语言代码)...
  10. python能做什么游戏-用Python可以做哪些有意思的小游戏呢?
  11. python爬虫线上编辑_Python 爬虫入门《中》
  12. matlab里直线拟合,matlab如何拟合直线
  13. PPT分享 | 怎么在区块链上保护隐私?
  14. 《你不知道的JavaScript》学习佛系梳理
  15. 2021 编程语言排行榜出炉!
  16. 九宫格摆法_九宫格婚纱照摆法图片与技巧
  17. 抑郁症:从自毁到重生,可能你只差一个它
  18. 人工神经网络英文简称,人工神经网络 英文
  19. H5实现透明通道视频
  20. 【资料分享】工程师必备物联网资料合集 电子书PDF

热门文章

  1. [转贴]绝妙经典,让大家认清什么叫领导!(暴笑)
  2. pandas 数据比对
  3. iPhone 11出现绿屏状态,你遇到没?
  4. 新手建站之【创建站点】⑤
  5. BZOJ 1305 dance跳舞 二分+最大流
  6. java基础之泛型(Generics)
  7. 电脑和服务器怎样实现无盘启动,电脑无盘启动服务器怎么配置
  8. linux悬镜服务器登陆失败,悬镜服务器卫士服务器连接登录失败怎么办?
  9. 留一法(交叉验证法,Leave-One-Out Cross Validation)
  10. m3u8格式转成MP4以及可播放格式