B站Android多主题框架开源:MagicaSakura
最近不少同学在后台催更,还有朋友开始问我是不是出啥事了- -!,是得出来解释下,其实就是最近重心没有放在公众号这块,至于具体缘由就不说啦,感觉各种借口都要被我用完了,你们就当我懒癌复发吧。讲真,真心要给一直支持我的同学们道个歉,尽管很久不更,读者还是在慢慢增长,昨天终于破万了,非常感谢大家一直以来的支持呀,以后还是得坚持发文,尽量勤快些。算起来运营这号刚好半年多时间,当初还觉得这个目标好遥远,其实得益于积累的力量,
做技术何尝不是如此。
今天推荐给各位的是 B 站 xyczero 同学的文章,早前他曾给我投稿过 Android 多主题之坑 一文,其实是来自 B 站的多主题实践总结,近期已将其多主题框架开源,为此专门撰文介绍细节,分享给大家。
可以先看看效果:
以下是 xyczero 同学的原文,文中外链不可点击,点击文末阅读原文可直接访问 MagicaSakura GitHub 项目主页。
- 如何不重启 APP 切换多主题?
- 如何只写一份 drawable 或 layout 就可以自动适配各种多主题?
- 如何兼容低版本的 Android 系统?
- 如何减少开发人员的学习成本,能够快速适应多主题框架?
开源多主题框架 MagicaSakura 都可以帮你做到。
此处的多主题是指轻量级的多彩主题色,而非插件化形式的多主题皮肤。
不重启APP切换主题
MagicaSakura 提供了全局方法 Theme.refreshUI,直接调用即可无需重启 App 更换应用主题(当然必须得在主线程-,-),同时该方法提供了额外的回调参数,以便满足在主题切换过程中的各种自定义需求。
自适应多主题
Drawable XML
使用预先定义的颜色值,只需编写一份 drawable 即可自动适配多主题样式,无需再为每一种主题都编写一份 drawable 或 style。
支持常规标签
selector,item , shape, layerlist,color 等常规 xml 标签都已支持,能满足应用基本开发需求。
支持直接染色
支持在 xml 中直接染色 (app : drawableTint , app : drawableTintMode),如:
标签配置颜色透明度
在 shape 标签中配置颜色透明度 (android : alpha)
Layout XML
使用 MagicaSakura 中的提供的 TintXXX 控件可以在 layout 中直接对其 drawable 属性进行染色,如:background, src, drawableLeft, button 等,并且包括文字颜色,超链接颜色在内都可以自动跟随多主题变化,非常快捷方便。
代码中适配多主题
MagicaSakura 支持在代码中直接适配多主题。
对于 MagicaSakura 中的 TintXXX 控件
在代码中可以直接对 TintXXX 控件的相关 drawable 进行染色,使用方法与 Android 原生控件基本一致,如:
对于一些特殊需求或自定义控件
MagicaSakura 中提供了 ThemeUtils 工具类,该工具类主要提供了 drawable 染色以及主题色自动转换的相关方法,其中主题色自动转换支持 colorStateList 和 color,可以非常方便的在代码中进行多主题适配。
兼容低版本的 Android 系统
MagicaSakura 目前兼容的最低 SDK 版本为 API 15,即 Android 4.0.3 版本,基本符合绝大多数 APP 开发中的最低 API 要求。
尽量减少学习成本
为减少学习成本,MagicaSakura 基于 Android 原生控件封装了一套 TintXXX 控件,包含所有常用的控件类型,如:TextView,Button,EditText, ProgressDialog 等,能基本满足常规应用开发需求。
TintXXX 控件可自动适配多主题样式,支持在 layout.xml,drawable.xml 和代码中配置。特别的在 layout.xml 中可以方便地与 Android 原生属性配合使用,如 app : drawableLeftTint 可以直接染色 android : drawableLeft,app : backgroundTint 直接染色 android : background 等。
关于夜间模式和多主题皮肤
MagicaSakura 支持夜间模式平滑切换(即无需重启应用),只需在 res 中按需添加相关的 xxx_night 资源文件包。
特别得当 app 的 support 库版本低于 23.2.0 时,可以直接使用 MagicaSakura 内提供的 ThemeUtils.updateNightMode() 方法切换夜间模式,当 support 库版本大于等于 23.2.0 时可以使用 support 库提供的方法。其实Android是原生支持夜间模式的,更多介绍可以详见 Android 多主题之坑 这篇文章。
多主题皮肤和多彩主题是不完全相同的,支持多主题皮肤一般需要引入插件框架,而多彩主题则相对轻量一些。目前 MagicaSakura 暂不支持多主题皮肤,以后会考虑增加对其的支持。
开源
经过几周的筹备和优化,现正式将多主题框架 MagicaSakura 开源,希望能对你有所帮助。
- 相关源码和详细文档都已在 GitHub 开源,欢迎大家来围观,指出不足之处,一起来完善 MagicaSakura 多主题框架。
- 传送门地址:https://github.com/Bilibili/MagicaSakura。
- Demo 下载地址:http://7xr9x5.com1.z0.glb.clouddn.com/magicasrkura_sample-debug.apk