Android框架还提供了另外两种动画体系:视图动画(View Animation)和属性动画(Property Animation)。视图动画比较简单,只能应用于各种View,可以做一些位置、大小、旋转和透明度的简单转变。属性动画则是在android 3.0引入的动画体系,提供了更多特性和灵活性,也可以应用于任何对象,而不只是View。本篇先讲视图动画。
视图动画只能作用于View,而且视图动画改变的只是View的绘制效果,View真正的属性并没有改变。比如,一个按钮做平移的动画,虽然按钮的确做了平移,但按钮可点击的区域并没随着平移而改变,还是在原来的位置。而属性动画则可以改变真正的属性,从而实现按钮平移时点击区域也跟着平移。
在xml文件res/目录下创建anim文件,可以通过<alpha>, <scale>, <translate>, <rotate>, 或者<set>属性元素来实现动画.
通用属性
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:detachWallpaper 设置是否在壁纸上运行,只对设置了壁纸背景的窗口动画(window animation)有效。设为true,则动画只在窗口运行,壁纸背景保持不变
- android:fillAfter 设置为true时,动画执行完后,View会停留在动画的最后一帧;默认为false;如果是动画集,需在<set>标签中设置该属性才有效
- android:fillBefore 设置为true时,动画执行完后,View回到动画执行前的状态,默认即为true
- android:fillEnabled 设置为true时,android:fillBefore的值才有效,否则android:fillBefore会被忽略
- android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
- android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
restart 动画重复执行时从起点开始,默认为该值
reverse 动画会反方向执行 - android:startOffset 设置动画执行之前的等待时长,毫秒为单位;重复执行时,每次执行前同样也会等待一段时间
- android:zAdjustment 表示被设置动画的内容在动画运行时在Z轴上的位置,取值为以下三个值之一:
normal 默认值,保持内容在Z轴上的位置不变
top 保持在Z周最上层
bottom 保持在Z轴最下层 - android:interpolator 设置动画速率的变化,比如加速、减速、匀速等
<alpha> 透明度渐变动画
渐变也就是淡入淡出的效果,通过下面三个属性实现:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromAlpha 动画开始时的透明度,0.0为全透明,1.0为不透明,默认为1.0
- android:toAlpha 动画结束时的透明度,0.0为全透明,1.0为不透明,默认为1.0
---->代码实现:
<alpha
android:duration="2000"
android:fillAfter="true"
android:fromAlpha="0.2"
android:toAlpha="1.0" />
view 调用
button.startAnimation(AnimationUtils.loadAnimation(this,R.anim.alpha_animation));
<scale>缩放动画
属性:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromXScale 动画开始时X坐标上的缩放尺寸
- android:toXScale 动画结束时X坐标上的缩放尺寸
- android:fromYScale 动画开始时Y坐标上的缩放尺寸
- android:toYScale 动画结束时Y坐标上的缩放尺寸
---- > 以上四个属性,0.0表示缩放到没有,1.0表示正常无缩放,小于1.0表示收缩,大于1.0表示放大. - android:pivotX 缩放时的固定不变的X坐标,一般用百分比表示,0%表示左边缘,100%表示右边缘
- android:pivotY 缩放时的固定不变的Y坐标,一般用百分比表示,0%表示顶部边缘,100%表示底部边缘
<scale
android:duration="2000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5"
/>
View 调用
button.startAnimation(AnimationUtils.loadAnimation(this,R.anim.scale_animation));
<translate>位置移动动画
可以是垂直方向的移动,也可以是水平方向的移动。坐标的值可以有三种格式:从-100到100,以"%"结束,表示相对于View本身的百分比位置;如果以"%p"结束,表示相对于View的父View的百分比位置;如果没有任何后缀,表示相对于View本身具体的像素值。主要的属性如下:
android:duration 动画从开始到结束持续的时长,单位为毫秒
android:fromXDelta 起始位置的X坐标的偏移量
android:toXDelta 结束位置的X坐标的偏移量
android:fromYDelta 起始位置的Y坐标的偏移量
android:toYDelta 结束位置的Y坐标的偏移量
<translate
android:duration="2000"
android:fillAfter="true"
android:fromXDelta="-100"
android:fromYDelta="-100"
android:toXDelta="100%"
android:toYDelta="100%"
/>
View 调用
button.startAnimation(AnimationUtils.loadAnimation(this,R.anim.translate_animation));
<rotate> 旋转动画
属性:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromDegrees 旋转开始的角度
- android:toDegrees 旋转结束的角度
- android:pivotX 旋转中心点的X坐标,纯数字表示相对于View本身左边缘的像素偏移量;带"%"后缀时表示相对于View本身左边缘的百分比偏移量;带"%p"后缀时表示相对于父View左边缘的百分比偏移量
- android:pivotY 旋转中心点的Y坐标,纯数字表示相对于View本身顶部边缘的像素偏移量;带"%"后缀时表示相对于View本身顶部边缘的百分比偏移量;带"%p"后缀时表示相对于父View顶部边缘的百分比偏移量
<translate
android:duration="2000"
android:fillAfter="true"
android:fromXDelta="-100"
android:fromYDelta="-100"
android:toXDelta="100%"
android:toYDelta="100%"
/>
View调用
button.startAnimation(AnimationUtils.loadAnimation(this,R.anim.rotate_animation));
<set> 动画集合
<set>标签在视图动画中可以组合<alpha>, <scale>, <translate>, <rotate>这四种标签.
<set
android:duration="2000"
android:fillAfter="true"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.3"
android:toAlpha="1.0" />
<scale
android:fromXScale="0"
android:fromYScale="0"
android:pivotX="50"
android:pivotY="50"
android:toXScale="1.0"
android:toYScale="1.0" />
<translate
android:fromXDelta="-100"
android:fromYDelta="-100"
android:toXDelta="100"
android:toYDelta="100" />
<rotate
android:fromDegrees="0"
android:pivotX="10"
android:pivotY="10"
android:toDegrees="3600"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
</set>
View调用
button.startAnimation(AnimationUtils.loadAnimation(this,R.anim.set_animation));
Interpolator 动画速率变化
interpolator可以定义动画速率变化的方式,比如加速、减速、匀速等,每种interpolator都是 Interpolator 类的子类,Android系统已经实现了多种interpolator,对应也提供了公共的资源ID,
如下:
Interpolator class | Resource ID | Description |
---|---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 在动画开始与结束时速率改变比较慢,在中间的时候加速 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 在动画开始时速率改变比较慢,然后开始加速 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 动画开始的时候向后然后往前抛 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值 |
BounceInterpolator | @android:anim/bounce_interpolator | 动画结束的时候会弹跳 |
CycleInterpolator | @android:anim/bounce_interpolator | 动画循环做周期运动,速率改变沿着正弦曲线 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 在动画开始时速率改变比较快,然后开始减速 |
LinearInterpolator | @android:anim/decelerate_interpolator | 动画匀速播放 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 动画向前抛,会抛超过最后值,然后再返回 |