Android 主题换肤的开源库(插件化换肤)

新增夜间模式的简洁实现方式,不需要再去单独创建一个皮肤包(目前处于beta版本)

夜间模式实现方式

  1. 前提条件还是每个使用到的资源必须是引用的,不能是具体的值
  2. 开启全局换肤配置 SkinConfig.enableGlobalSkinApply()
  3. 复制一份 color.xml 文件并重命名为 color_night.xml ,然后修改 color_night.xml,在每一个 color 的 name 后面加上一个 _night后缀
  4. 对于 drawable 文件的处理也差不多,复制需要夜间模式切换的 drawable 文件,然后在其文件名上加上一个 _night 后缀,xml 文件中的颜色值修改成夜间模式需要的即可
  5. 最后在适当的地方调用 SkinManager.getInstance().NightMode() 即可实现夜间模式
  6. 具体实现可以参考示例项目

效果图如下:

1. 集成步骤:

  1. 添加依赖 compile 'com.solid.skin:skinlibrary:latestVersion' 

  2. 让你的 Application 继承于 SkinBaseApplication

  3. 让你的 Activity 继承于 SkinBaseActivity,如果使用了 Fragment 则继承于 SkinBaseFragment

  4. 在需要换肤的根布局上添加 xmlns:skin="http://schemas.android.com/android/skin" ,然后在需要换肤的View上加上 skin:enable="true" 

  5. 新建一个项目模块(只包含有资源文件,例如本项目的 skinpackage 模块),其中包含的资源文件的 name 一定要和原项目中有换肤需求的 View 所使用的资源name一致。

  6. 拿到上一步生成的文件( ×××.apk ),改名为 ×××.skin,放入 assets 中的 skin 目录下( skin 目录是自己新建的)

  7. 调用换肤

  • 在 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

  1. SkinConfig.isDefaultSkin(context):判断当前皮肤是否是默认皮肤

  2. SkinManager.getInstance().restoreDefaultTheme(): 重置默认皮肤

  3. dynamicAddView:当动态创建的View也需要换肤的时候,就可以调用 dynamicAddView


5. 使用注意事项:

  1. 换肤默认只支持 android 的常用控件,对于支持库的控件和自定义控件的换肤需要动态添加(例如: dynamicAddSkinEnableView(toolbar, "background", R.color.colorPrimaryDark);),在布局文件中使用skin:enable="true"是无效的。

  2. 默认不支持状态栏颜色的更改,如果需要换肤的同时也要更改状态栏颜色,请到您的Application文件中加入SkinConfig.setCanChangeStatusColor(true);,状态栏的颜色值来源于colorPrimaryDark

  3. 本开源库使用的 Activity 是 AppCompatActivity,使用的 Fragment 是 android.support.v4.app.Fragment

  4. 有换肤需求 View 所使用的资源一定要是引用值,例如:@color/red,而不是 #ff0000

6.项目依赖:

  1. 'com.android.support:appcompat-v7:25.3.1'
  2. '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 主题换肤的开源库相关推荐

  1. Android主题换肤实现

    本系列文章主要是对一个Material Design的APP的深度解析,主要包括以下内容 基于Material Design Support Library作为项目整体框架.对应博文:Android ...

  2. Android主题换肤 无缝切换

    作者 _SOLID 关注 2016.04.17 22:04* 字数 4291 阅读 23224评论 123喜欢 679 今天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需 ...

  3. Android主题换肤 无缝切换 你值得拥有

    链接:https://www.jianshu.com/p/af7c0585dd5b 天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需Activity的重启直接实现无缝切换 ...

  4. Android 主题换肤技术方案分析

    写在前面 Android TV 电视开发,主题换肤,我感觉有两种层级的方式,一种是 系统级,另一种 是应用级, 我记得很早在 Linux 桌面开发的时候,我们之前的公司在GTK+上也实现了一套换肤UI ...

  5. android view设置按钮颜色_Android 主题换肤技术方案分析

    写在前面 Android TV 电视开发,主题换肤,我感觉有两种层级的方式,一种是 系统级,另一种 是应用级, 我记得很早在 Linux 桌面开发的时候,我们之前的公司在GTK+上也实现了一套换肤UI ...

  6. miui主题风格_一种android系统换肤功能的设计,董红光:MIUI主题风格.pdf

    MIUI主题风格主题风格主题风格主题风格 一种Android系统换肤功能的设计思路 董红光 2/29/2012 "主题"是什么 ? Symbian的"主题" A ...

  7. Android App 换肤实现方式

    Android App 换肤的引入意味着给用户提供不同的界面样式,以适应不同用户的审美需求.引入换肤可以让用户更加个性化地使用 App,增强用户对 App 的黏度和使用体验. Android App ...

  8. android换肤的实现方案,Android应用开发之Android一键换肤功能实现

    本文将带你了解Android应用开发之Android一键换肤功能实现,希望本文对大家学Android有所帮助. < 市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式 下图是网易云音乐 ...

  9. Element UI主题换肤功能(基于vue-element-admin框架)

    环境信息: 日期:2022-08-05 node版本:v14.15.4 "sass": "1.26.8", "sass-loader": & ...

最新文章

  1. Dapper学习笔记(3)-增、删、改、查
  2. Appium如何获取appPackage和appActivity
  3. oracle SQL 命令行(四.安全性自主控制)
  4. 基于动态背包的多场景广告序列投放算法
  5. HeartBeat 集群组件概述
  6. Zookeeper基于Java访问-权限模式
  7. java数组循环动态赋值_Java数组
  8. python安装numpy库教程_Python库之numpy库的安装教程
  9. web optimize_image / Jpegoptim / ImageOptim / google webP
  10. jquery获取验证码按钮倒计时
  11. 进不去jetbrain官网怎么办
  12. thx是什么意思_在高数中thx表示什么意思-thx-数学-别杂南同学
  13. NCRE考试感想 四级嵌入式(上)
  14. pyton 内置模块
  15. qt websocket android,QT使用websocket进行长连接
  16. 使用 Vue3 + elementPlus 做一个每日习惯打卡表
  17. sendToTarget与sendMessage
  18. 【oracle】oracle创建表、创建索引、创建自增id
  19. camera.swf java,ipcamera-for-android 手机变成IP Camera
  20. iis tomcat php,IIS7 与 Tomcat8共用端口(ISAPI)

热门文章

  1. CPU、内存和人工智能领域的GPU知识详解
  2. 游戏服务器人数无限制,使用人数过少 EA关闭多款游戏在线服务器
  3. CPU空闲时在忙什么
  4. latex插入代码块
  5. 用于SAAS公司的MRR模型--对一个公司LTV的预测
  6. 汇编语言编辑器安装及运行环境搭建
  7. 全国计算机软考证书全称,2021年上半年计算机软考证书成绩查询通知(附:学院成绩查询)...
  8. 郭台铭失宠了?近三成苹果订单被分走,外媒:库克“不赏饭”了
  9. Android 输入英语单词实现(post网络请求)在线翻译,支持多种语言翻译
  10. M3U8视频流本地下载