View动画解析

2022-02-12  本文已影响0人  彩虹_直至黑白

View动画通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,它是一种渐进式动画,并且View支持自定义。View动画的作用对象是View,支持4种动画效果,分别是平移动画,缩放动画,旋转动画,透明度动画

View动画种类

View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。这四种动画既可以通过XML来定义,也可以通过代码来动态创建,对于View动画来说,建议采用XML来定义动画,这主要是因为XML格式的动画可读性更好。

image
平移动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true">
        <!--<set>标签表示动画集合,对应AnimationSet类,它可以包含若干个动画-->
    <!-- android:duration  动画持续时间, 默认值是0 (单位ms)-->
    <!-- android:fillAfter 表示动画结束后是否保留动画后的状态,true保留动画后状态,false恢复原来状态,默认值是false -->
    <!-- android:fillBefore 表示动画结束后是否保留动画前的状态,true恢复原来状态,false保留动画后状态,默认值是true-->
    <!--android:interpolator 设置动画的变化速率 即插值器,改变动画变换的速度-->
    <!--android:repeatMode 设置动画重复的模式,其值可以有,restart( 1 ),表示顺序播放,reverse(2)表示重复的时候逆向播放 -->
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="50%p"
        android:toYDelta="50%p" />
    
    <!--    在这些属性里面还可以加上%和p,例如:-->
    <!--    android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。-->
    <!--    android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。-->
</set>
缩放动画
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="-1"
    android:repeatMode="reverse"
    android:startOffset="0"
    android:toXScale="1.1"
    android:toYScale="1.1" />

    <!-- android:fromXScale  水平方向缩放的起始值,比如0.5-->
    <!--android:toXScale 水平方向缩放的结束值,比如1.2-->
    <!--android:fromYScale 竖直方向缩放的起始值-->
    <!--android:toYScale 竖直方向缩放的结束值-->
    <!--android:pivotX 缩放的轴点的x坐标,它会影响缩放的效果-->
    <!--android:pivotY 缩放的轴点的y坐标,它会影响缩放的效果-->
旋转动画
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="true"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="-1"
    android:toDegrees="360" />

    <!-- android:fromDegrees——旋转开始的角度,比如0;-->
    <!-- android:toDegrees——旋转结束的角度,比如180;-->
    <!-- android:pivotX——旋转的轴点的x坐标;-->
    <!-- android:pivotY——旋转的轴点的y坐标。-->
透明度动画
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="true"

    android:fromAlpha="1"
    android:toAlpha="0.6" />

    <!--    0f表示完全透明,1f表示完全不透明-->
    <!--    android:fromAlpha   动画开始的透明度-->
    <!--    android:toAlpha     动画结束时的透明度-->

那我们该如何应用上面的动画呢 ?

        btnScale.setOnClickListener {
            val animation = AnimationUtils.loadAnimation(this, R.anim.view_anim_scale)
            btnScale.startAnimation(animation)
        }

最后,关于动画添加过程的监听我们可以通过Animation的setAnimationListener方法

   animation.setAnimationListener(object : Animation.AnimationListener {

                override fun onAnimationStart(animation: Animation?) {

                }

                override fun onAnimationEnd(animation: Animation?) {

                }

                override fun onAnimationRepeat(animation: Animation?) {

                }
            }
上一篇下一篇

猜你喜欢

热点阅读