动画的种类
Android动画大体可以分为以下3种:
逐帧动画(Drawable Animation)
视图动画(View Animation)
属性动画(Property Animation)
一般来说,属性动画是首选的使用方法,因为它更灵活,并提供更多功能。视图动画和逐帧动画仿佛将退出历史的舞台,但有时使用起来也挺方便的。
下面来看一下视图动画的四种动画
1.平移(translate)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"//属性为动画持续时间
说明: 时间以毫秒为单位
android:fromXDelta="100%"//属性为动画起始时 X坐标上的位置
android:fromYDelta="100%"//属性为动画起始时 Y坐标上的位置
android:toXDelta="0"//属性为动画结束时 X坐标上的位置
android:toYDelta="0"//属性为动画结束时 Y坐标上的位置
注意:
没有指定fromXType toXType fromYType toYType 时候,
默认是以自己为相对参照物
android:interpolator="@android:anim/accelerate_interpolator"
/>//interpolator是插值器,就是控制动画以怎样的速度变化完成动画
</set>
2.缩放(scale)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="500"
android:fromXScale="0.0"//属性为动画起始时 X坐标上的伸缩尺寸
android:fromYScale="0.0"属性为动画起始时 Y坐标上的伸缩尺寸
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"//属性为动画相对于view的X坐标的开始位置
android:pivotY="50%"//属性为动画相对于view的Y坐标的开始位置
android:toXScale="1.0"//属性为动画结束时 X坐标上的伸缩尺寸
android:toYScale="1.0"//属性为动画结束时 Y坐标上的伸缩尺寸 />
</set>
fromXScale,fromYScale,toXScale,toYScale
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX,pivotY
以上两个属性值 从0%-100%中取值
50%为view的X或Y方向坐标上的中点位置
3.旋转(rotate)
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:duration="500"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
</set>
上面已经介绍过的属性就不讲了,讲一下他的私有属性
浮点数型值:
fromDegrees:属性为动画起始时物件的角度
toDegrees:属性为动画结束时物件旋转的角度 可以大于360度
说明:当toDegrees-fromDegrees>0表示顺时针旋转
当toDegrees-fromDegrees<0表示逆时针旋转
pivotX=“50%”
旋转中心x轴坐标,取值可以是数值(50)、百分数(50%)、
百分数p(50%p)
当取值为数值时,缩放起点为View左上角坐标加具体数值像素。
当取值为百分数时,表示在当前View左上角坐加上View宽度的具体百分比。
当取值为百分数p时,表示在View左上角坐标加上父控件宽度的具体百分比。
4.透明度(alpha)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
</set>
fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度
说明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
5.一些公有方法
XML属 性:android:repeatCount
关联方法:setRepeatCount(int)
说明:设置动画重复执行的次数 ,默认值是0
XML属 性:android:repeatMode
关联方法:setRepeatMode(int)
说明:设置动画重复的模式,其值可以有,restart( 1 ),表示顺序播放,reverse(2)表示重复的时候逆向播放
XML属 性:android:fillAfter
关联方法:setFillAfter(boolean)
说明:表示动画结束后是否保留动画后的状态,true保留动画后状态,false恢复原来状态,默认值是false
XML属 性:android:fillBefore
关联方法:setFillBefore(boolean)
说明:表示动画结束后是否保留动画前的状态,true恢复原来状态,false保留动画后状态,默认值是true
XML属 性:android:fillEnabled
关联方法:setFillEnabled(boolean)
说明:如果设置为true,将fillBefore设置考虑在内
XML属 性:android:startOffset
关联方法:setStartOffset(long)
说明:设置开始的延迟的时间(单位ms) ,默认值是0
6.下面主要说下插值器(interpolator)
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
7.overridePendingTransition()
实现两个 Activity 切换时的动画。在Activity中使用
有两个参数:进入动画和出去的动画。
注意
1、必须在 StartActivity() 或 finish() 之后立即调用。
val intent = Intent(this, ClassroomPowerControl::class.java)
startActivity(intent)
overridePendingTransition(R.anim.loginenter, R.anim.anim_no)
override fun finish() {
super.finish()
overridePendingTransition(0,R.anim.alpha)
}
下面是遇到的坑,当你从ActivityA切到Activity B时由于你给ActivityA设置了进入Activity B的动画而没有设置离开ActivityA的动画,回出现中间黑屏的情况,你只需要再加一个离开的动画。
如下
overridePendingTransition(R.anim.loginenter, R.anim.anim_no)
R.anim.loginenter是进入Activity B的动画
R.anim.anim_no是离开ActivityA的动画,而其实它没有实质性的动画,只是起到一个延时的效果。
注意它们两个动画的duration应该相同。
如下
R.anim.loginenter:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="500" android:fromYDelta="100%" android:toYDelta="0" /> </set>
R.anim.anim_no
<?xml version="1.0" encoding="utf-8"?>8.如果你要达到动画顺序执行的效果
那需要设置以下2个属性
XML属 性:android:fillAfter
关联方法:setFillAfter(boolean)
说明:表示动画结束后是否保留动画后的状态,true保留动画后状态,false恢复原来状态,默认值是false
XML属 性:android:startOffset
关联方法:setStartOffset(long)
说明:设置开始的延迟的时间(单位ms) ,默认值是0
比如
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<set android:fillAfter="true">
<alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.5" />
<scale
android:duration="500"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.1"
android:toYScale="0.1" />
</set>
<set
android:fillAfter="true"
android:startOffset="500">
<translate
android:duration="400"
android:interpolator="@android:anim/accelerate_interpolator"
android:toXDelta="100%" />
</set>
<set
android:fillAfter="true"
android:startOffset="900">
<rotate
android:duration="700"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="-360" />
</set>
</set>
之前我是设置在rotate,translate,scale,alpha标签里的,结果发现不行,后面搬到set标签里就可以了。