ThemeDemo
Introduction: 日夜间模式切换
Tags:
模式切换-
前面:
实现的原理像我微博之前的说的那样.
关于多主题实现的,我这里的做法是继承 AppCompatActivity,置换了 AppCompatDelegate 中 AppCompatViewInflater 中的 createView 方法.实现了对 xml 控件的控制.
实现:
- 实现了日夜模式的切换.(不重启 Acitivity )
- 解决了因为快速点击 View 导致的多次响应点击事件.
- 内部实现了 Android 5.0 的 CircularReveal 效果.
优点:
布局中直接使用 Android 默认的控件就可以.在解析以后会根据控件转换成支持主题切换的控件.解放冗余的名称.
缺点:
暂时不支持 Menu 级的切换.
支持属性:
View 级:nightBackground
TextView 级:nightTextColornightTextColorHighlightnightTextAppearancenightTextColorLinknightTextColorHint
ListView 级:nightLVDivider
LinearLayout 级别:nightDivider
第三方控件支持:
nightBackgroundnightTextColor
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 这个接口:模板
未来可能实现的:
- 实现 Toolbar 和 menu 的日夜间切换.
- 替换 CircularReveal 算法 .
- 出个轻量的,不带日夜间切换的库.
尾巴:
- 实现原理主要是受到代码家在Google I/O 2015 为 Android 开发者带来了哪些福利里面的启发.
- 我在项目中也仅仅只是用在解决快速点击 View 导致的多响应,和使用 CircularReveal 效果.日夜间模式并没有这个需求.
