本文将介绍3个关于Material Design动画中触摸反馈特效的demo。
demo1:用ripple标签实现点击屏幕后的涟漪波纹反馈特效
效果展示
当点击屏幕时,屏幕上将出现以手指为圆心、向外扩散的圆形涟漪波纹效果,如下所示:
实现过程
上述特效是Material Design特有的效果,故需要使用Android5.0自带的主题,若不考虑兼容性,可以在AndroidManifest中声明的主题继承于如下父类主题:
- 1
- 1
考虑到Android碎片化问题,更多时候,还是应使用兼容主题作为父类主题:
- 1
- 1
下面是界面的布局,就是两个简单的TextView,涟漪波纹效果就在这两个TextView上产生。
- 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
- 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
代码的关键就是属性android:background
,Android5.0为开发者提供了一个标签ripple,只需在drawable文件夹下创建一个以ripple为根标签的XML文件,就能产生波纹涟漪效果:
ripple.xml文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
ripple2.xml文件
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
ripple标签中的android:color
属性是必须要指定的,该属性用于指定元素被点击时的颜色;若还需指定未点击时的元素颜色,需要加入子标签item,并通过android:drawable
属性指定未点击元素时的颜色,此时,波纹只能在控件所在区域扩散(如点击第二个TextView时所示),而若需要在点击元素时,波纹能扩散至元素范围之外(如点击第一个TextView时所示),只需要把子标签item去掉就可以了,此时的元素背景色将是缺省色。
demo2:点击元素产生元素被手指吸附的效果
效果展示
当点击某个元素时,元素在Z轴上增加了一定的高度(通过增加阴影表现),仿佛是元素被按下的手指吸附一样,效果如下:
未点击时无吸附效果
点击时有吸附效果
实现过程
布局如下:
- 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
- 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
首先定义了1个ToolBar和3个CardView,这两个控件都在android.support.v7.widget包中,故声明控件时需要指定全限定类名;重点是属性android:stateListAnimator
,该属性可为元素设置“基于状态的动画(stated-based animator)”,通过在drawable文件夹中定制以selector为根标签的XML文件,可实现吸附效果。
在drawable中自定义基于状态的动画:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
Android5.0为selector增加了动画效果,上述代码分别指定了当元素处于点击状态和非点击状态时的属性,可以看出,是通过属性动画实现的,关键就在于属性android:valueTo
,该属性指定元素在Z轴上的高度。
demo3:综合
本demo将综合上面两个demo的部分知识点,实现当元素处于点击状态时,该元素发生躲闪的小游戏。
实现效果
初始样式
点击第一行第二列的元素时,元素上移。
点击第二行第二列的元素时,元素消失。
点击第三行第一列的元素时,元素向左下角移动。
实现过程
定义一个元素的统一样式,方便代码复用。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
接着定义布局文件,代码的关键仍然是属性android:stateListAnimator
,通过该属性可以定制基于状态的动画。
- 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
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 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
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
在drawable文件夹中用selector标签给元素定制基于状态的动画:
给第一行第一列元素指定动画:
- 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
- 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
给第一行第二列元素指定动画:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
给第二行第二列元素指定动画:
- 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
- 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
给第三行第三列指定动画:
- 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
- 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
上面代码实现了部分元素的动画效果,其余动画效果与之相仿,它们的共同特点是分别设置了元素被点击和未被点击时的动画效果,而元素移动的方向主要用属性android:propertyName
来设置,若为值为"translationY"
,则表示元素在纵向上有位移;若为"translationX"
,则表示元素在横向上有位移;若为"ScaleX"
或"ScaleY"
,表示元素自身在横轴或纵轴上有伸缩。而屏幕规定的坐标轴是以左上角为原点,水平向右的方向是X轴的正方向,铅直向下的方向是Y轴的正方向。通过这个规定,就可以通过属性android:valueTo
来确定元素运动的方向和距离:元素向左移动80dp,可将属性android:propertyName
设为"translationX"
,属性android:valueTo
设为设为”-80dp”;元素向右下方移动80dp,可以同事指定两个属性动画,其中一个属性android:propertyName
设为"translationX"
,属性android:valueTo
设为设为”80dp”,另一个属性android:propertyName
设为"translationY"
,属性android:valueTo
设为设为”80dp”,若希望元素被点击时消失,可指定两个属性动画,其中一个为android:propertyName="ScaleX" android:valueTo="0"
,另一个为android:propertyName="ScaleY" android:valueTo="0"