Android 多颜色主题框架MagicaSakura使用

MagicaSakura的github地址

MagicaSakura是B站的主题框架,可以不重启app进行主题的切换,但是这里的多主题只是颜色的切换。本文演示一下MagicaSakura的用法。

  • step1
    添加gradle dependency
compile 'com.bilibili:magicasakura:0.1.5@aar'
  • step2
    Application需要实现ThemeUtils.Switcher接口,该接口有两个方法来给提供切换的颜色。
public interface switchColor {
    @ColorInt int replaceColorById(Context context, @ColorRes int colorId);
    @ColorInt int replaceColor(Context context, @ColorInt int color);
}

然后设置Switcher

public class MyApplication extends Application implements ThemeUtils.switchColor{

    @Override
    public void onCreate() {
        super.onCreate();
        ThemeUtils.setSwitchColor(this);
    }
    @Override
    public int replaceColorById(Context context, @ColorRes int colorId) {

        return xx;//将colorId 替换的颜色resId
    }

    @Override
    public int replaceColor(Context context, @ColorInt int originColor) {

        return xx;//将originColor替换的颜色resId
    }
}

该库提供一系列的基于原生android控件的TintXX控件,可以满足一般的开发需求。
Android 多颜色主题框架MagicaSakura使用_第1张图片
以下为demo布局文件


<com.bilibili.magicasakura.widgets.TintLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary"
    android:orientation="vertical">
    <com.bilibili.magicasakura.widgets.TintToolbar
        android:id="@+id/common_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
   <LinearLayout
       android:padding="20dp"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="center_vertical"
       android:background="@android:color/white"
       android:orientation="vertical">


       <com.bilibili.magicasakura.widgets.TintButton
           android:id="@+id/btn_red"
           android:text="red"
           android:onClick="onClick"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:background="@color/colorPrimary"/>
       <com.bilibili.magicasakura.widgets.TintButton
           android:id="@+id/btn_yellow"
           android:text="yellow"
           android:onClick="onClick"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"/>
       <com.bilibili.magicasakura.widgets.TintButton
           android:id="@+id/btn_green"
           android:text="green"
           android:onClick="onClick"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"/>
       <com.bilibili.magicasakura.widgets.TintButton
           android:id="@+id/btn_blue"
           android:text="blue"
           android:onClick="onClick"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"/>
       <com.bilibili.magicasakura.widgets.TintButton
           android:id="@+id/btn_brown"
           android:text="brown"
           android:onClick="onClick"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"/>
   LinearLayout>
com.bilibili.magicasakura.widgets.TintLinearLayout>

MainActvity代码
按不同的按钮,就会将主题对应的字符串持久化,然后通过EventBus通知activity换肤,每一次换肤,只需调用ThemeUtils.refreshUI(Context context, ExtraRefreshable extraRefreshable),然后遍历View,在Tint控件中回调switchColor的方法。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.common_toolbar);
        initToolBar(toolbar);
        EventBus.getDefault().register(this);
    }

    protected void initToolBar(Toolbar toolbar) {

        if (toolbar == null) return;

        toolbar.setTitle(getString(R.string.app_name));
        setSupportActionBar(toolbar);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    public void onClick(View view){
        switch (view.getId()){
            case R.id.btn_red:
                ThemeSpUtils.setTheme(this,ThemeSpUtils.THEME_RED);
                break;
            case R.id.btn_blue:
                ThemeSpUtils.setTheme(this,ThemeSpUtils.THEME_BLUE);
                break;
            case R.id.btn_brown:
                ThemeSpUtils.setTheme(this,ThemeSpUtils.THEME_BROWN);
                break;
            case R.id.btn_green:
                ThemeSpUtils.setTheme(this,ThemeSpUtils.THEME_GREEN);
                break;
            case R.id.btn_yellow:
                ThemeSpUtils.setTheme(this,ThemeSpUtils.THEME_YELLOW);
                break;

        }
        EventBus.getDefault().post("theme_change");
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(Object event) {

        if (event.toString().equals("theme_change")) {
            ThemeUtils.refreshUI(this, new ThemeUtils.ExtraRefreshable() {
                @Override
                public void refreshGlobal(Activity activity) {
                    if (Build.VERSION.SDK_INT >= 21) {
                        ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(null, null, ThemeUtils.getThemeAttrColor(MainActivity.this, android.R.attr.colorPrimary));
                        setTaskDescription(taskDescription);
                        getWindow().setStatusBarColor(ThemeUtils.getColorById(MainActivity.this, R.color.colorPrimaryDark));
                    }
                }

                @Override
                public void refreshSpecificView(View view) {

                }
            });
        }
    }
}

效果

Android 多颜色主题框架MagicaSakura使用_第2张图片 Android 多颜色主题框架MagicaSakura使用_第3张图片

你可能感兴趣的:(android)