android百科Androidandroid成神之路

MagicaSakura多主题框架

2016-06-26  本文已影响2751人  _xyczero

如何不重启APP切换多主题?
如何只写一份drawable或layout就可以自动适配各种多主题?
如何兼容低版本的Android系统?
如何减少开发人员的学习成本,能够快速适应多主题框架?
开源多主题框架 MagicaSakura 都可以帮你做到。
(备注:此处的多主题是指轻量级的多彩主题色,而非插件化形式的多主题皮肤)

不重启APP切换主题

MagicaSakura提供了全局方法Theme.refreshUI,直接调用即可无需重启App更换应用主题(当然必须得在主线程-,-),同时该方法提供了额外的回调参数,以便满足在主题切换过程中的各种自定义需求。

自适应多主题

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>
```

// 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);

兼容低版本的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开源,希望能对你有所帮助。

欢迎查看 个人博客.

上一篇下一篇

猜你喜欢

热点阅读