android studio button位置_Android 主题色无缝切换方案:Databinding下实现控件皮肤无缝切换...

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群

作者:showMethe
链接:https://www.jianshu.com/p/9e0c4b0af0dc
声明:本文已获showMethe授权发表,转发等请联系原作者授权

无缝切换主题色

这个功能一直都是Android的开发经常遇到的。我逛的最多的B站App就是一个很好地例子,他们的皮肤切换是无缝的,那我们自己能不能自己也来搞一个,当然是可以的,虽然有重复造轮子,但是我们还是需要不断锻炼自己的开发水平,尝试不同的方案。

Github可以找到一个不错的皮肤切换库:https://github.com/fengjundev/Android-Skin-Loader

基于LayoutInflaterFactory的皮肤切换,涉及到LayoutInflater 提供了setFactory(LayoutInflater.Factory factory)和setFactory2(LayoutInflater.Factory2 factory) 的知识点,这里不展开。

看完这个库的源码我想了个问题,我能不能另外开辟一条简单的路去走呢,这时候捡起了手中的Databinding。

所以本文章是基于Databinding下进行的,受限于框架使用,所以相比于Android-Skin-Loader,我建议使用Android-Skin-Loader因为它更加灵活,本文章提到的方案开辟的路开窄了,特别是不支持Databinding的项目,诸如在旧项目上迭代的不适用本方案,不喜欢Databinding框架的同学也不太适用,因为有很多模板代码,而且是用Kotlin进行开发的,如果不想项目引入额外的Kotlin也不适用。这次这条路真的开窄了。

先介绍使用方法

本库的测试环境是基于我一个玩安卓项目进行的:https://github.com/ShowMeThe/MaterialWanAndroid

本库地址,单独使用skinlib的内容:https://github.com/ShowMeThe/SkinManager/tree/master/skinlib

先放效果(Gif 有点卡)

80bbb01da8c28af65cfbcd6d7246201d.gif

1.gif

在Application初始化

val themes_name = arrayListOf(

分别配置主题的名字Key和对应的Value,Value是Style里面对应的资源

<style name="MaterialTheme.Blue">

同时增加对Json的解析,因为不是所有的主题都要写在style,可能遇到需要后台下载解析的情况

val json = AssetFile.getJson(

其中getJson方法如下:

fun getJson(context: Context, fileName: String): String {

fromJson方法入下

inline 

这两个方法各位可以自己写,我这里提供参考而已

由于当时写的时候,路开窄了而且不想引入太多额外的库,对Widget判断是直接采用包名的提取,所以只支持AndroidX和官方那个MaterialDesign的Widget库 于是添加了一个自定义插件的方法IPlugin,举SwipeRefreshLayout这个Widget作为例子:

class RefreshPlugin : IPlugin<SwipeRefreshLayout> {

这个Json对应

{
  "theme_viewGroup_background": "FBC02D",
  "theme_viewGroup_backgroundColor": "FBC02D",
  "theme_card_strokeColor": "FBC02D",
  "theme_text_color": "FBC02D",
  "theme_button_textColor": "FBC02D",
  "theme_button_rippleColor": "2cFDD835",
  "theme_button_iconTint": "FBC02D",
  "theme_button_strokeColor": "FBC02D",
  "theme_bottom_navigation_iconTint": "FBC02D",
  "theme_bottom_navigation_textColor": "FBC02D",
  "theme_imageView_tint": "FBC02D",
  "theme_floating_backgroundColor": "FBC02D",
  "theme_edit_cursorDrawable": "FBC02D",
  "theme_edit_highlightColor": "FBC02D",
  "theme_inputLayout_boxColor": "FBC02D",
  "theme_inputLayout_hintColor": "FBC02D",
  "colorObjects": [
    "FBC02D",
    "2cFDD835"
  ]
}

以上都是举一些例子,内容都需要根据实际进行修改,这里只是探讨一个方案。

相关阅读

1 Android 夜间模式 换肤
2 Android 自定义注解处理器并生成 json 文件
3 Android开发 如何最优的在 Activity 里释放资源
4 Flutter 实现 App 内更新安装包
5 探索 Android 内存优化方法

adb9fca3d6bf3049cd67744edc7aa828.png 如果你有写博客的好习惯欢迎投稿

点个在看,小生感恩❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值