效果图:
前面:
实现的原理像我微博之前的说的那样.
关于多主题实现的,我这里的做法是继承AppCompatActivity,置换了AppCompatDelegate中AppCompatViewInflater中的createView 方法.实现了对 xml 控件的控制.
实现:
- 实现了日夜模式的切换.(不重启 Acitivity )
- 解决了因为快速点击 View 导致的多次响应点击事件.
- 内部实现了 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
布局上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<
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"
切换主题方法:
1
2
3
4
5
6
7
|
/**
*
* @param activity 当前 Activity
* @param skinStyle Dark(夜间),Light(日间)
* @param skinStyleChangeListener (转换监听器)
*/
SkinCompat.setSkinStyle(Activity activity, SkinStyle skinStyle,SkinStyleChangeListener skinStyleChangeListener)
|
使用CircularReveal 效果:
5.0 上面用的是原生的 api,5.0下面才是自己的实现的方法.
1
2
3
4
5
6
|
CRAnimation crA =
new
CircularRevealCompat(mRl).circularReveal(
mFloatingActionButton.getLeft() + mFloatingActionButton.getWidth() /
2
, mFloatingActionButton.getTop() + mFloatingActionButton.getHeight() /
2
,
0
, mRl.getHeight());
if
(crA !=
null
)
crA.start();
|
扩展:
支持对原生控件的解析时期替换:
1
2
3
4
5
6
7
8
9
10
11
12
|
这边很奇葩的把 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这个接口: 模板