Android动态换肤(一、应用内置多套皮肤)
动态换肤在很多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动态换肤(一、应用内置多套皮肤)相关推荐
- android 状态栏 背景色_技术一面:说说Android动态换肤实现原理
换肤分为动态换肤和静态换肤 静态换肤 这种换肤的方式,也就是我们所说的内置换肤,就是在APP内部放置多套相同的资源.进行资源的切换. 这种换肤的方式有很多缺点,比如, 灵活性差,只能更换内置的资源.a ...
- Android 动态换肤技术原理 | 实践 及总结
实现的效果图 动态换肤一般实现的原理 对页面需要换肤的View进行标记 在Activity#setContentView()加载view时获取到标记的view(后面会说是要怎么获取到) 创建一个Lib ...
- android 动态换肤框架,GitHub - ss520k/Android-Skin-Loader: 一个通过动态加载本地皮肤包进行换肤的皮肤框架...
Android-Skin-Loader 更新日志 导入到Android Studio,使用gradle构建皮肤包(见7. 皮肤包是什么?如何生成?)(2015-12-02) 解决Fragment换肤在 ...
- android换肤动画,Android动态换肤框架-实现换肤
1.换肤流程 1 2.采集流程 2 3.Android资源查找流程 3 4.采集需要换肤的控件 换肤我们需要换所有可能需要换的页面控件,所以我们不可能在每个页面重新findviewById,这时就需要 ...
- 真香定律!Android动态换肤实现原理解析,原理+实战+视频+源码
自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils.DbUtils.ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的.最近决定研究一下xUtils的 ...
- android布局优化!Android动态换肤实现原理解析,灵魂拷问
" 对于程序员来说,如果哪一天开始他停止了学习,那么他的职业生涯便开始宣告消亡." 高薪的IT行业是众多年轻人的职业梦想,然而,一旦身入其中却发觉没有想像中那么美好.被称为IT蓝领 ...
- Android动态换肤实现原理解析,原理+实战+视频+源码
前言 本人今年25岁,毕业之后进入一家小型的互联网公司工作,在这原公司呆了3年,直至今年才有了跳槽的想法. 每个程序员 都拥有大厂梦,我也不例外,在小公司待久了,感觉人会荒废掉,太轻松,没有压迫感.因 ...
- android视频编辑sdk!Android动态换肤实现原理解析,灵魂拷问
" 对于程序员来说,如果哪一天开始他停止了学习,那么他的职业生涯便开始宣告消亡." 高薪的IT行业是众多年轻人的职业梦想,然而,一旦身入其中却发觉没有想像中那么美好.被称为IT蓝领 ...
- 安卓app开发教程!Android动态换肤实现原理解析,值得收藏!
开头 Android开发,假如开始没有任何的开发经验的话, 千万不要着急,不要想着在短时间内就把一个语言学习好, 因为你之前没有任何的学习经验, 在这个过程中需要有耐心地学习完JAVA的基础知识, 然 ...
最新文章
- 起飞,会了这4个 Intellij IDEA 调试魔法,阅读源码都简单了
- 基于EEG/EMG/EOG的多模态人机接口,实时控制软机器人手
- Windows 中 SQLite3 使用(1) -- 配置
- 博士面试被拒,只因第一学历非985、211...
- unity 纹理压缩格式‘_纹理优化:让你的纹理也“瘦”下来
- mybatis那些事~
- Linux基础学习七:mysql的安装和配置教程
- TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
- 队列的基本操作c语言代码大全,数据结构――队列(循环队列)的基本操作(实现链队列逐一取出c语言代码)...
- python能做什么游戏-用Python可以做哪些有意思的小游戏呢?
- python爬虫线上编辑_Python 爬虫入门《中》
- matlab里直线拟合,matlab如何拟合直线
- PPT分享 | 怎么在区块链上保护隐私?
- 《你不知道的JavaScript》学习佛系梳理
- 2021 编程语言排行榜出炉!
- 九宫格摆法_九宫格婚纱照摆法图片与技巧
- 抑郁症:从自毁到重生,可能你只差一个它
- 人工神经网络英文简称,人工神经网络 英文
- H5实现透明通道视频
- 【资料分享】工程师必备物联网资料合集 电子书PDF