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?) {
}
}