Android 日夜間模式切換:ThemeDemo
效果圖:
前面:
實現的原理像我微博之前的說的那樣.
關于多主題實現的,我這里的做法是繼承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
布局上
<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這個接口:模板
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
