11月更文挑战|Android基础-View动画

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

View动画

相对而言View动画只作用于Views,在实现和开发成本上比较简单易用。 View动画分四种变换效果的补间动画:TranslateAnimationScaleAnimationRotateAnimationAlphaAnimation。同时还提供AnimationSet动画集合,通过动画集合类可以将多个补间动画组合起来使用。

名称 xml标签 类名
平移 <translate> TranslateAnimation
缩放 <scale> ScaleAnimation
旋转 <rotate> RotateAnimation
透明 <alpha> AlphaAnimation
动画集合 <set> AnimationSet

通过XML文件配置动画

<set>标签可以包含若干动画实现组合动画,例如旋转+位移效果。 <set>标签具有两个属性值interpolatorshareInterpolator

  • interpolator

表示动画集合的插值器,用于设置动画速度。例如匀速执行动画或变速先快后慢执行。

  • shareInterpolator

表示集合中的动画是否和set共享同一个插值器,集合中的动画也可以单独设置自己的插值器。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:duration="long"
        android:fillAfter="bool"
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>
复制代码
方法介绍
<translate> TranslateAnimation android:fromXDelta x坐标起始值
android:toXDelta x坐标结束值
android:fromYDelta y坐标起始值
android:toYDelta y坐标结束值
<scale> ScaleAnimation android:fromXScale x坐标缩放起始值
android:toXScale x坐标缩放结束值
android:fromYScale y坐标缩放起始值
android:toYScale y坐标缩放结束值
android:pivotX 缩放原点坐标x
android:pivotY 缩放原点坐标y
<rotate> RotateAnimation android:fromDegrees 旋转角度开始
android:toDegrees 旋转角度结束值
android:pivotX 旋转原点坐标x
android:pivotY 旋转原点坐标y
<alpha> AlphaAnimation android:fromAlpha 透明度起始值
android:toAlpha 透明度结束值

另外还有两个公用属性值android:durationandroid:fillAfter

  • android:duration

表示动画持续时间,单位是ms

  • android:fillAfter

动画结束后View是否停留在结束位置。

通过代码配置动画

通过代码编写动画会比xml配置多了一些更多自由度的配置可能性,例如动态计算原点坐标、监听动画执行过程等。

// 旋转
RotateAnimation rotateAnimation = new RotateAnimation(0, 360, 100, 100);
rotateAnimation.setDuration(1000); // 动画持续时间
rotateAnimation.setFillAfter(true); // 是否保持动画最后状态
rotateAnimation.setRepeatCount(-1);
rotateAnimation.setInterpolator(new AccelerateInterpolator()); // 插值器
textView.startAnimation(rotateAnimation);
// 位移
TranslateAnimation translateAnimation = new TranslateAnimation(0, 200, 0, 200);
translateAnimation.setRepeatCount(-1);
translateAnimation.setDuration(1000);
textView.startAnimation(translateAnimation);
// 缩放
ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1);
scaleAnimation.setDuration(1000);
textView.startAnimation(scaleAnimation);
// 透明度
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);// 透明度0变化到透明度为1
alphaAnimation.setDuration(1000);// 动画执行时间1s
textView.startAnimation(alphaAnimation);
复制代码

使用AnimationSet组合多个动画,实现组合动画。

AnimationSet animationSet = new AnimationSet(true);
animationSet.setDuration(1000);

AlphaAnimation alpha = new AlphaAnimation(0,1);
alpha.setDuration(1000);
animationSet.addAnimation(alpha);

TranslateAnimation translate = new TranslateAnimation(100, 200, 0, 200);
translate.setDuration(1000);
animationSet.addAnimation(translate);
textView.startAnimation(animationSet);
复制代码

设置动画监听获取动画开始、结束和重复事件回调事件。

animation.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation animation) {
        //动画开始时
    }
    @Override
    public void onAnimationEnd(Animation animation) {
        //动画结束时
    }
    @Override
    public void onAnimationRepeat(Animation animation) {
        //动画重复时
    }
});
复制代码

另外动画还有几个重要参数设置:动画重复次数和动画重复形式。

  • 动画重复次数

通过设置setRepeatCount来设置动画重复次数,若小于0表示无限循环。

  • 动画重复形式

通过设置setRepeatMode来设置重复模式,三种模式是INFINITERESTARTREVERSE。默认情况下INFINITERESTART效果是一致的,REVERSE会执行从最终值再返回到原有值效果。

Animation.setRepeatCount(-1); // 动画重复次数
Animation.setRepeatMode();  //动画重复形式
复制代码

总结

View动画基本能力如上所示,基本满足了日常开发需求。更多动画能力可通过动画组合协同完成和实现。View动画唯一的缺点在于只能作用于View,更高阶动画实现就需要运用到属性动画了。

位移 旋转 缩放 透明度 组合
e2122ec22e64edcdcb79ff7f32227ed6.gif 6e4d1a7331dc34ccfe6ea66440c091d1.gif d3e98b01ac316d1847e3a083a447cab6.gif 3277dfe4e00b63e7fec4b52576e85f30.gif c67f52af0a3498ff3b789198a8dd2e84.gif

Guess you like

Origin juejin.im/post/7033729777110351885