Android 主题换肤的开源库
Android 主题换肤的开源库(插件化换肤)
新增夜间模式的简洁实现方式,不需要再去单独创建一个皮肤包(目前处于beta版本)
夜间模式实现方式
- 前提条件还是每个使用到的资源必须是引用的,不能是具体的值
- 开启全局换肤配置
SkinConfig.enableGlobalSkinApply()
- 复制一份
color.xml
文件并重命名为color_night.xml
,然后修改color_night.xml
,在每一个 color 的 name 后面加上一个_night
后缀 - 对于
drawable
文件的处理也差不多,复制需要夜间模式切换的drawable
文件,然后在其文件名上加上一个_night
后缀,xml
文件中的颜色值修改成夜间模式需要的即可 - 最后在适当的地方调用
SkinManager.getInstance().NightMode()
即可实现夜间模式 - 具体实现可以参考示例项目
效果图如下:
1. 集成步骤:
添加依赖
compile 'com.solid.skin:skinlibrary:latestVersion'
让你的 Application 继承于 SkinBaseApplication
让你的 Activity 继承于 SkinBaseActivity,如果使用了 Fragment 则继承于 SkinBaseFragment
在需要换肤的根布局上添加
xmlns:skin="http://schemas.android.com/android/skin"
,然后在需要换肤的View上加上skin:enable="true"
新建一个项目模块(只包含有资源文件,例如本项目的 skinpackage 模块),其中包含的资源文件的 name 一定要和原项目中有换肤需求的 View 所使用的资源name一致。
拿到上一步生成的文件( ×××.apk ),改名为 ×××.skin,放入 assets 中的 skin 目录下( skin 目录是自己新建的)
调用换肤
在
assets/skin
文件夹中的皮肤SkinManager.getInstance().loadSkin("Your skin file name in assets(eg:theme.skin)",new ILoaderListener() {@Overridepublic void onStart() {Toast.makeText(getApplicationContext(), "正在切换中", Toast.LENGTH_SHORT).show();}@Overridepublic void onSuccess() {Toast.makeText(getApplicationContext(), "切换成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onFailed() {Toast.makeText(getApplicationContext(), "切换失败", Toast.LENGTH_SHORT).show();}});
皮肤来源于网络
SkinManager.getInstance().loadSkinFromUrl(skinUrl, new ILoaderListener() {@Overridepublic void onStart() {Log.i("ILoaderListener", "正在切换中");dialog.setContent("正在从网络下载皮肤文件");dialog.show();}@Overridepublic void onSuccess() {Log.i("ILoaderListener", "切换成功");dialog.dismiss();}@Overridepublic void onFailed(String errMsg) {Log.i("ILoaderListener", "切换失败:" + errMsg);dialog.setContent("换肤失败:" + errMsg);}@Overridepublic void onProgress(int progress) {Log.i("ILoaderListener", "皮肤文件下载中:" + progress);dialog.setProgress(progress);}});
详细的使用,请到示例项目中查看
2.换肤属性的扩展
本开源库默认支持 textColor 和 background 的换肤。如果你还需要对其他属性进行换肤,那么就需要去自定义了。
那么如何自定义呢?看下面这个例子:
TabLayout大家应该都用过吧。它下面会有一个指示器,当我们换肤的时候也希望这个指示器的颜色也跟着更改。
新建一个 TabLayoutIndicatorAttr 继承于 SkinAttr,然后重写 apply 方法。apply 方法在换肤的时候就会被调用
代码的详细实现
public class TabLayoutIndicatorAttr extends SkinAttr {@Overridepublic void apply(View view) {if (view instanceof TabLayout) {TabLayout tl = (TabLayout) view;if (RES_TYPE_NAME_COLOR.equals(attrValueTypeName)) {int color = SkinResourcesUtils.getColor(attrValueRefId);tl.setSelectedTabIndicatorColor(color);}}} }
注:attrValueRefId:就是资源 id。SkinResourcesUtils 是用来获取皮肤包里的资源,这里设置color或者drawable一定要使用本工具类。
当上面的工作完成之后,就到我们自己的 Application 的 onCreate 方法中加入
SkinConfig.addSupportAttr("tabLayoutIndicator", new TabLayoutIndicatorAttr());
最后我们就可以正常使用了,
dynamicAddSkinEnableView(tablayout, "tabLayoutIndicator", R.color.colorPrimaryDark);
3. 关于字体切换
还是遵守本项目的约定大于配置的原则,所有的字体都放到 assets/fonts 文件夹下
如何切换字体: SkinManager.getInstance().loadFont("xx.ttf")
关于切换字体需要配置的东西: 如果只是单纯的想要字体切换这个功能。只需集成步骤
中的前三步就行了。
注:字体切换功能默认不开启,需要字体切换功能请在你的Application中加入SkinConfig.setCanChangeFont(true);
4. 其他一些重要的api
SkinConfig.isDefaultSkin(context):判断当前皮肤是否是默认皮肤
SkinManager.getInstance().restoreDefaultTheme(): 重置默认皮肤
dynamicAddView:当动态创建的View也需要换肤的时候,就可以调用 dynamicAddView
5. 使用注意事项:
换肤默认只支持 android 的常用控件,对于支持库的控件和自定义控件的换肤需要动态添加(例如:
dynamicAddSkinEnableView(toolbar, "background", R.color.colorPrimaryDark);
),在布局文件中使用skin:enable="true"
是无效的。默认不支持状态栏颜色的更改,如果需要换肤的同时也要更改状态栏颜色,请到您的Application文件中加入
SkinConfig.setCanChangeStatusColor(true);
,状态栏的颜色值来源于colorPrimaryDark
本开源库使用的 Activity 是 AppCompatActivity,使用的 Fragment 是 android.support.v4.app.Fragment
有换肤需求 View 所使用的资源一定要是引用值,例如:@color/red,而不是 #ff0000
6.项目依赖:
- 'com.android.support:appcompat-v7:25.3.1'
- 'com.mani:ThinDownloadManager:1.2.5'
7.更新日志:
- v2.0.0 beta:无需使用皮肤包即可实现夜间模式
- v1.4.5:fix issues 38
- v1.4.4:修复 @null 带来的bug
- v1.4.3:由于在开启全局皮肤切换后,过度动画会带来一些问题,在这个版本中删除了过度动画
- v1.4.2:增加对全局应用皮肤方法,若开启则不需要在布局文件中添加
skin:enable="true"
- v1.4.1:增加从指定目录获取drawable的方法
- v1.4.0:
- 修复issues9内存泄漏问题
- 支持 style
- 解决字体切换内存泄漏问题
- 支持 mipmap
- 状态栏颜色切换只支持 5.0 以上版本
- 增加 debug 开关,方便开发调试
- v1.3.1:优化换字体部分代码
- v1.3.0:增加一键切换字体
- v1.2.1:完善之前版本 View 的创建
- v1.2.0:增加对换肤属性自定义扩展
- v1.1.0:可以直接加载网络上的皮肤文件
Android 主题换肤的开源库相关推荐
- Android主题换肤实现
本系列文章主要是对一个Material Design的APP的深度解析,主要包括以下内容 基于Material Design Support Library作为项目整体框架.对应博文:Android ...
- Android主题换肤 无缝切换
作者 _SOLID 关注 2016.04.17 22:04* 字数 4291 阅读 23224评论 123喜欢 679 今天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需 ...
- Android主题换肤 无缝切换 你值得拥有
链接:https://www.jianshu.com/p/af7c0585dd5b 天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需Activity的重启直接实现无缝切换 ...
- Android 主题换肤技术方案分析
写在前面 Android TV 电视开发,主题换肤,我感觉有两种层级的方式,一种是 系统级,另一种 是应用级, 我记得很早在 Linux 桌面开发的时候,我们之前的公司在GTK+上也实现了一套换肤UI ...
- android view设置按钮颜色_Android 主题换肤技术方案分析
写在前面 Android TV 电视开发,主题换肤,我感觉有两种层级的方式,一种是 系统级,另一种 是应用级, 我记得很早在 Linux 桌面开发的时候,我们之前的公司在GTK+上也实现了一套换肤UI ...
- miui主题风格_一种android系统换肤功能的设计,董红光:MIUI主题风格.pdf
MIUI主题风格主题风格主题风格主题风格 一种Android系统换肤功能的设计思路 董红光 2/29/2012 "主题"是什么 ? Symbian的"主题" A ...
- Android App 换肤实现方式
Android App 换肤的引入意味着给用户提供不同的界面样式,以适应不同用户的审美需求.引入换肤可以让用户更加个性化地使用 App,增强用户对 App 的黏度和使用体验. Android App ...
- android换肤的实现方案,Android应用开发之Android一键换肤功能实现
本文将带你了解Android应用开发之Android一键换肤功能实现,希望本文对大家学Android有所帮助. < 市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式 下图是网易云音乐 ...
- Element UI主题换肤功能(基于vue-element-admin框架)
环境信息: 日期:2022-08-05 node版本:v14.15.4 "sass": "1.26.8", "sass-loader": & ...
最新文章
- Dapper学习笔记(3)-增、删、改、查
- Appium如何获取appPackage和appActivity
- oracle SQL 命令行(四.安全性自主控制)
- 基于动态背包的多场景广告序列投放算法
- HeartBeat 集群组件概述
- Zookeeper基于Java访问-权限模式
- java数组循环动态赋值_Java数组
- python安装numpy库教程_Python库之numpy库的安装教程
- web optimize_image / Jpegoptim / ImageOptim / google webP
- jquery获取验证码按钮倒计时
- 进不去jetbrain官网怎么办
- thx是什么意思_在高数中thx表示什么意思-thx-数学-别杂南同学
- NCRE考试感想 四级嵌入式(上)
- pyton 内置模块
- qt websocket android,QT使用websocket进行长连接
- 使用 Vue3 + elementPlus 做一个每日习惯打卡表
- sendToTarget与sendMessage
- 【oracle】oracle创建表、创建索引、创建自增id
- camera.swf java,ipcamera-for-android 手机变成IP Camera
- iis tomcat php,IIS7 与 Tomcat8共用端口(ISAPI)
热门文章
- CPU、内存和人工智能领域的GPU知识详解
- 游戏服务器人数无限制,使用人数过少 EA关闭多款游戏在线服务器
- CPU空闲时在忙什么
- latex插入代码块
- 用于SAAS公司的MRR模型--对一个公司LTV的预测
- 汇编语言编辑器安装及运行环境搭建
- 全国计算机软考证书全称,2021年上半年计算机软考证书成绩查询通知(附:学院成绩查询)...
- 郭台铭失宠了?近三成苹果订单被分走,外媒:库克“不赏饭”了
- Android 输入英语单词实现(post网络请求)在线翻译,支持多种语言翻译
- M3U8视频流本地下载