视图动画的常用用法

秦焱
2023-12-01

动画的种类
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标签里就可以了。

 类似资料: