这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
View动画
相对而言View动画只作用于Views,在实现和开发成本上比较简单易用。 View动画分四种变换效果的补间动画:TranslateAnimation
、ScaleAnimation
、RotateAnimation
和AlphaAnimation
。同时还提供AnimationSet
动画集合,通过动画集合类可以将多个补间动画组合起来使用。
名称 | xml标签 | 类名 |
---|---|---|
平移 | <translate> | TranslateAnimation |
缩放 | <scale> | ScaleAnimation |
旋转 | <rotate> | RotateAnimation |
透明 | <alpha> | AlphaAnimation |
动画集合 | <set> | AnimationSet |
通过XML文件配置动画
<set>
标签可以包含若干动画实现组合动画,例如旋转+位移效果。 <set>
标签具有两个属性值interpolator
和shareInterpolator
。
- 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:duration
和android: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
来设置重复模式,三种模式是INFINITE
、RESTART
、REVERSE
。默认情况下INFINITE
、RESTART
效果是一致的,REVERSE
会执行从最终值再返回到原有值效果。
Animation.setRepeatCount(-1); // 动画重复次数
Animation.setRepeatMode(); //动画重复形式
复制代码
总结
View
动画基本能力如上所示,基本满足了日常开发需求。更多动画能力可通过动画组合协同完成和实现。View
动画唯一的缺点在于只能作用于View
,更高阶动画实现就需要运用到属性动画了。
位移 | 旋转 | 缩放 | 透明度 | 组合 |
---|---|---|---|---|