MagicaSakura多主题框架

作者: _xyczero | 来源:发表于2016-06-26 20:04 被阅读2751次

    如何不重启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下载地址: 点击直接下载

    欢迎查看 个人博客.

    相关文章

      网友评论

      • 吉原拉面:“当support库版本大于等于23.2.0时可以使用support库提供的方法”,这句话是什么意思,大于等于23.2.0只能自己手动实现夜间模式切换吗?怎么切?
        _xyczero:support提供了相关的方法,不过原理还是一样的
      • JulianAndroid:你好,请问如何在设置页面(PreferenceActivity 或 PreferenceFragment)中适配多彩主题。
        _xyczero:@JulianAndroid 可以在Activity的onCreateView里把相关view的创建代理,相当于自己创建tint类控件
      • _xyczero:可以用ThemeUtil里的方法控制染色
      • wavever:请问如果使用其他第三方控件,需要更改的时候,需要实现一个Tintxx之类的么?不然貌似修改不了Background,谢谢。
      • _xyczero:因为你的本activity中需要切换夜间模式的地方没有使用Magicasakura包装的控件
      • 素笺淡墨染流年:楼主 我在用你的框架 我使用夜间模式 调用了
        ThemeUtils.updateNightMode(mContext.getResources(),true) ;
        ThemeUtils.refreshUI(mContext);
        本activity没有发生变化 其他的activity变了
        怎么让自身activity 发生变化 不重启activity?
      • shone:66666666
        _xyczero:@shone 😀
      • 7237d3980f55:很好用,取名也二次元,毕竟Bilibili :smile:
        _xyczero:@ImagineBreaker :smiley: 哈哈

      本文标题:MagicaSakura多主题框架

      本文链接:https://www.haomeiwen.com/subject/whvrdttx.html