Android 日夜间模式切换:ThemeDemo

jopen 9年前

效果图:

ThemeDemo.gif

Github

前面:

实现的原理像我微博之前的说的那样.

关于多主题实现的,我这里的做法是继承AppCompatActivity,置换了AppCompatDelegate中AppCompatViewInflater中的createView 方法.实现了对 xml 控件的控制.

实现:

  1. 实现了日夜模式的切换.(不重启 Acitivity )
  2. 解决了因为快速点击 View 导致的多次响应点击事件.
  3. 内部实现了 Android 5.0 的CircularReveal效果.

优点:

布局中直接使用 Android 默认的控件就可以.在解析以后会根据控件转换成支持主题切换的控件.解放冗余的名称.

缺点:

暂时不支持 Menu 级的切换.

支持属性:

View 级:
nightBackground
TextView 级:
nightTextColor
nightTextColorHighlight
nightTextAppearance
nightTextColorLink
nightTextColorHint
ListView 级:
nightLVDivider
LinearLayout 级别:
nightDivider
第三方控件支持:nightBackground
nightTextColor

gradle:

/build.gradle

repositories {      maven {          url "https://jitpack.io"      }  }

/app/build.gradle

compile 'com.github.zzz40500:ThemeDemo:0.1'

使用方法:

代码上

Activity 继承MAppCompatActivity

布局上

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                xmlns:tools="http://schemas.android.com/tools"                android:id="@+id/rl"                android:layout_width="match_parent"                android:layout_height="match_parent"                android:background="@color/light_bg"                xmlns:app="http://schemas.android.com/apk/res-auto"                android:orientation="vertical"                tools:ignore="MissingPrefix"                app:nightBackground="@color/night_bg"                tools:context=".MainActivity">      <android.support.v7.widget.Toolbar          android:id="@+id/toolBar"          android:layout_height="?attr/actionBarSize"          android:layout_width="fill_parent"          />      <TextView          android:layout_width="fill_parent"          android:id="@+id/tv"          android:layout_below="@+id/toolBar"          android:gravity="center"          android:background="@color/red"          android:text="TextView"          android:textColor="@color/normal_black"          android:textAppearance="@style/TextAppearance.AppCompat.Display1"          android:layout_height="100dp"          app:nightTextColor="@color/night_tv_color"          app:nightBackground="@color/night_bg"          />        <Button          android:layout_below="@+id/tv"          android:layout_width="fill_parent"          android:text="Click"          android:id="@+id/button"          android:background="@color/button_bg"          android:textColor="@color/normal_black"          android:layout_height="50dp"          app:nightBackground="@color/night_bg"          />        <android.support.design.widget.FloatingActionButton          android:id="@+id/fb"          android:layout_width="48dp"          android:layout_alignParentRight="true"          android:layout_alignParentBottom="true"          android:layout_margin="16dp"          android:layout_height="48dp"          app:backgroundTint="#ff87ffeb"          app:rippleColor="#33728dff"          android:src="@mipmap/ic_launcher"          android:orientation="vertical" />    </RelativeLayout>

处女座在根控件加入tools:ignore="MissingPrefix"

切换主题方法:

/**   *    * @param activity 当前 Activity   * @param skinStyle Dark(夜间),Light(日间)   * @param skinStyleChangeListener (转换监听器)   */  SkinCompat.setSkinStyle(Activity activity, SkinStyle skinStyle,SkinStyleChangeListener skinStyleChangeListener)

使用CircularReveal 效果:

5.0 上面用的是原生的 api,5.0下面才是自己的实现的方法.

CRAnimation crA =          new CircularRevealCompat(mRl).circularReveal(                  mFloatingActionButton.getLeft() + mFloatingActionButton.getWidth() / 2, mFloatingActionButton.getTop() + mFloatingActionButton.getHeight() / 2, 0, mRl.getHeight());    if (crA != null)      crA.start();

扩展:

支持对原生控件的解析时期替换:

这边很奇葩的把 TextView 变成了 EditText 控件,只是为了替换而替换.  WidgetFactor.getInstant().setWidgetParser(new WidgetFactor.WidgetParser() {      @Override      public View parseWidget(String name, Context context, AttributeSet attrs) {          //布局中的名称          if (name.equals("TextView")) {              return new EditText(context, attrs);          }          //返回 null 则不替换.          return null;      }  });

第三方控件支持CircularReveal效果:
实现CircleRevealEnable这个接口:模板

项目主页:http://www.open-open.com/lib/view/home/1441550774695