MagicaSakura多主题框架

如何不重启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)。如:

      • 直接染色
        <selector
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto">
               <item android:drawable="@drawable/icon " android:state_pressed="true"
        

app:drawableTint="@color/theme_color_primary" />
<item android:drawable="@drawable/icon" app:drawableTint="@color/gray_dark" />
</selector>
```

 - 标签配置颜色透明度
```java
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:state_pressed="true">
        <shape>
          <corners android:radius="4dp" />
          <solid android:color="@color/theme_color_primary_dark" />
        </shape>
    </item>
    <item android:state_enabled="true">
        <shape>
          <solid android:color="@color/theme_color_primary" />
          <corners android:radius="4dp" />
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape>
          <solid android:alpha="0.3" android:color="@color/theme_color_primary" />
          <corners android:radius="4dp" />
    </shape>
    </item>
</selector>
```
  • Layout XML
    使用MagicaSakura中的提供的TintXXX控件可以在layout 中直接对其drawable属性进行染色,如:background, src, drawableLeft, button 等,并且包括文字颜色,超链接颜色在内都可以自动跟随多主题变化,非常快捷方便。

// TintTextView
//其中drawableRightTint中的selector_lock是一个ColorStateList
<com.bilibili.magicasakura.widgets.TintTextView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="@dimen/padding_half"
android:drawableRight="@drawable/selector_lock"
android:text="@string/textview_title"
android:textColor="@color/selector_text"
android:textSize="19sp"
app:drawableRightTint="@color/selector_lock"/>


- **代码中适配多主题**
  MagicaSakura支持在代码中直接适配多主题。
  - 对于MagicaSakura中的TintXXX控件
   在代码中可以直接对TintXXX控件的相关drawable进行染色,使用方法与Android原生控件基本一致,例子如下:
    
    ``` java
       //TextView的background是一个shape类型的selector,那么就可以直接调用setBackgroundResource()方法进行染色。
        tintTextView.setBackgroundResource(R.drawable.selector_shape_lock);

       //ImageView的src是一个包含png的selector,那么只需比Android原生控件多调用一个方法。
       tintImageView.setImageResource(R.drawable.selecor_png_lock);
       tintImageView.setImageTintList(R.color.selector_color_lock);
  • 对于一些特殊需求或一些自定义控件
    MagicaSakura中提供了ThemeUtils工具类,该工具类主要提供了drawable染色以及主题色自动转换的相关方法,其中主题色自动转换支持colorStateList和 color,可以非常方便的在代码中进行多主题适配。
    // R.color.selector_color.lock 通过 getThemeColorStateList转换,返回主题色相关的colorStateList。
    ThemeUtils.getThemeColorStateList(context, R.color.selector_color.lock);
    

兼容低版本的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多主题框架。
    传送门地址:MagicaSakura

  • Demo下载地址: 点击直接下载

欢迎查看 个人博客.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,392评论 2 45
  • 记否?赖在山涧,栖在溪边,坐在石头上,脚浸山泉里,浸在溪水里,心霎时静了,一丝丝的清凉、一股细细甜甜的味道涌上心间...
    琥珀微暗阅读 302评论 0 3
  • 【销售之王】+谁是真正的常胜将军?+地不平 Todywu2013-10-7 看到【销售之王】这字眼,貌似来头不小,...
    todywu阅读 718评论 0 50
  • 天空浓稠得化不开的雾,和如巨兽白色绒毛的翻涌的雪花,一齐切割出这个晶莹剔透的瑰丽世界。 刀子一样的风将我的脸扎开一...
    填我十万八千梦阅读 373评论 0 9