一、简述
- 本文主要介绍View动画的平移、缩放、旋转和透明动画,帧动画,还有LayoutAnimation及Activity跳转动画。
- View动画建议使用XML来定义,文件的路径是res/anim/[动画文件名].xml。
二、View动画
accelerate_decelerate_interpolator
:加速-减速 动画插入器accelerate_interpolator
:加速-动画插入器decelerate_interpolator
:减速动画插入器
1.透明度控制动画效果alpha
1 | <alpha |
- 浮点型值:
fromAlpha
:属性为动画起始时透明度toAlpha
:属性为动画结束时透明度- 说明:
- 0.0表示完全透明
- 1.0表示完全不透明
- 以上值取0.0-1.0之间的float数据类型的数字
- 0.0表示完全透明
- 说明:
- 长整型值:
- duration 属性为动画持续时间
- 说明:
- 时间以毫秒为单位
2.尺寸伸缩动画效果scale
1 | <scale |
- 浮点型值:
- fromXScale:属性为动画起始时 X坐标上的伸缩尺寸
- toXScale:属性为动画结束时 X坐标上的伸缩尺寸
- fromYScale:属性为动画起始时Y坐标上的伸缩尺寸
- toYScale:属性为动画结束时Y坐标上的伸缩尺寸
- startOffset:属性为从上次动画停多少时间开始执行下个动画
- 说明:
- 以上四种属性值
- 0.0表示收缩到没有
- 1.0表示正常无伸缩
- 值小于1.0表示收缩
- 值大于1.0表示放大
- 百分比
- pivotX:属性为动画相对于物件的X坐标的开始位置
- pivotY:属性为动画相对于物件的Y坐标的开始位置
- 说明:
- 以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
- 长整型值:
- duration:属性为动画持续时间
- 说明: 时间以毫秒为单位
- 布尔型值:
- fillAfter:属性设置为true时,该动画转化在动画结束后被应用
3.位置转移动画效果translate
1 | <translate |
- 整型值:
- fromXDelta:属性为动画起始时 X坐标上的位置
- toXDelta:属性为动画结束时 X坐标上的位置
- fromYDelta:属性为动画起始时 Y坐标上的位置
- toYDelta:属性为动画结束时 Y坐标上的位置
- 注意:
- 没有指定fromXType toXType fromYType toYType 时候,默认是以自己为相对参照物
- 长整型值:
- duration:属性为动画持续时间
- 说明:时间以毫秒为单位
4.旋转动画效果rotate
1 | <rotate |
- 浮点数型值:
- fromDegrees:属性为动画起始时物件的角度
- toDegrees:属性为动画结束时物件旋转的角度 可以大于360度
- 说明:
- 当角度为负数——表示逆时针旋转
- 当角度为正数——表示顺时针旋转
- (负数from——to正数:顺时针旋转)
- (负数from——to负数:逆时针旋转)
- (正数from——to正数:顺时针旋转)
- (正数from——to负数:逆时针旋转)
- 百分比
- pivotX:属性为动画相对于物件的X坐标的开始位置
- pivotY:属性为动画相对于物件的Y坐标的开始位置
- 说明:以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
- 长整型值:
- duration:属性为动画持续时间
- 说明:时间以毫秒为单位
5. 在代码中使用动画
1 | Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade); |
6. 使用Java代码定义动画
1 | // 属性名称与xml中的名字类似 |
三、帧动画
帧动画是顺序播放一组预先定义好的图片。需要注意OOM问题。
定义
oneshot属性表示是否只播放一次,true表示只会播放一次,false表示一直循环播放
1
2
3
4
5
6
7
8
9
10
11<!-- frame_anim.xml -->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@mipmap/lottery_1"
android:duration="200" />
... ...
</animation-list>播放
1 | // 需要一个Drawable作为载体 |
四、View动画的特殊使用场景
1. LayoutAnimation
LayoutAnimation作用于ViewGroup为ViewGroup设置动画效果,这样它的子元素出场时会具有这种动画效果,经常被由于ListView可以在XML文件中设置,亦可以在Java代码中设置。
定义LayoutAnimation
1
2
3
4<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.8"
android:animationOrder="normal"
android:animation="@anim/anim_layout_item"/>- delay
表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期为300ms,那么0.5表示每子元素都要延迟150ms才能播放入场动画,简单点说如果delay=1,即每个动画都要等到上一个条目的动画完成后在播放入场动画。 - animationOrder
表示子元素动画的顺序,有三种选项:normal、reverse和random,其中normal表示顺序显示,即从第一个元素开始;reverse表示逆向显示,即从最后一个开始播放;random是随机播放。 - animation
为子元素指定具体的入场动画
- delay
为ViewGroup指定layoutAnimation属性
1
2
3
4<ListView
... ...
android:layoutAnimation="@anim/anim_layout"
... ... />也可以在代码中使用LayoutAnimationController实现
1
2
3
4
5Animation animation = AnimationUtils.loadAnimation(this, anim_layout_item);
LayoutAnimationController lac = new LayoutAnimationController(animation);
lac.setDelay(0.5f);
lac.setOrder(LayoutAnimationController.ORDER_REVERSE);
datalist.setLayoutAnimation(lac);
2. Activity跳转动画
在Android 2.0之后有了overridePendingTransition()可以用来控制跳转动画,其中里面两个参数,一个是前一个activity的退出,另一个activity的进入。这个方法必须放在startActivity和finish之后才能调用
Android提供了几种默认的跳转效果
1
2
3
4
5
6// 淡入淡出
android.R.anim.fade_in
android.R.anim.fade_out
// 滑入滑出
android.R.anim.slide_in_left
android.R.anim.slide_out_right使用方法
1
2
3startActivity(new Intent(T1Activity.this,T2Activity.class));
// 跳转之后调用
overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);