Android 日夜间模式切换:ThemeDemo

效果图:

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

布局上
?
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这个接口: 模板
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值