属性动画
概述
前面给我们分析了Android中的补间动画与帧动画的用法。
android 动画之补间动画与帧动画
接下来介绍属性动画的用法。
一、属性动画与补间动画的区别
1、 补间动画只能作用于View上,如TextView、ImageView等,但是不能作用于View之外的对象上(如颜色、字体大小等)。而补间动画可以对颜色值做动画,实现更复杂的动画效果。
2、补间动画只能实现视角效果,并不能改变View的属性值。
二、属性动画的用法介绍
属性动画主要由 ObjectAnimator 类与 ValueAnimator类来实现的。
1、ObjectAnimator:是对一个对象做动画,绑定一个对象之后,会自动计算对象的属性,修改属性值。
2、ValueAnimator:是对值做动画,先算出要变化的属性值,在通过监听值变化的函数修改对象的属性。
三、属性动画的实现
对象动画(ObjectAnimator)
实现方式可以通过XML或者代码的方式实现。
方法一:XML实现对象动画:
1、在 res 目录下新建文件夹animator
2、在 animator 文件夹下创建 XML文件
XML代码如下:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0.1"
android:valueType="floatType"
android:duration="5000"
android:repeatCount="infinite"
android:repeatMode="reverse"
/>
<!--
alpha:透明度
开始数值
结束数值
开始与结束数值类型
持续时间
持续次数
reverse:执行完一遍后 从末位置往前执行
-->
使用 java 代码加载 xml,启动动画
Animator animator = AnimatorInflater.loadAnimator(MainActivity.this, R.animator.animator_alpha);
animator.setTarget(imgShow);
animator.start();
XML 文件 的 propertyName 属性是表示动画种类的。
属性 | 含义 |
---|---|
alpha | 透明度 |
rotation | 以屏幕方向为轴的旋转 |
translationX / translationY | X/Y方向的位移 |
scaleX /scaleY | X/Y方向的缩放倍数 |
rotationX / rotationY | 以X/Y轴为轴的旋转 |
方式二:Java代码实现对象动画
private void alphaClick(){
// 实例化,imgShow:控件。alpha:执行动画的属性,后续为一个参数传多个值:开始,结束,结束之后状态。
ObjectAnimator animator = ObjectAnimator.ofFloat(imgShow,
"alpha",1f,0.1f);
//动画延迟500ms执行
animator.setStartDelay(100);
// 动画执行时间
animator.setDuration(5000);
// 动画执行次数
// INFINITE:无限循环执行
animator.setRepeatCount(INFINITE);
// 设置动画重复播放模式 RESTART -执行完一遍后重新执行
// REVERSE -执行完一遍后 从末位置往前执行
animator.setRepeatMode(REVERSE);
//加速查值器,参数越大,速度越来越快
animator.setInterpolator(new AccelerateInterpolator(5));
//监听值变换
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i("MainActivity","value:" +animation.getAnimatedValue());
}
});
animator.start();
}
值动画(ValueAnimator)
值动画通过属性值的变化,在手动赋值给对象的属性,从而实现动画。
代码如下:
// 值动画:修改控件的属性值变化。
ValueAnimator anim = ValueAnimator.ofFloat(1f, 0.1f);
anim.setDuration(3000);
anim.setRepeatCount(INFINITE);
anim.setRepeatMode(REVERSE);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("MainActivity", "cuurent value is " + currentValue);
// 手动将值赋予对象的属性
imgShow.setAlpha(currentValue);
}
});
anim.start();
PropertyValuesHolder
PropertyValuesHolder:可以将多种动画效果同时执行
// PropertyValuesHolder:同时执行多个动画。
PropertyValuesHolder alphaProper = PropertyValuesHolder.ofFloat("alpha", 0.5f, 1f);
PropertyValuesHolder scaleXProper = PropertyValuesHolder.ofFloat("scaleX", 0f, 1f);
PropertyValuesHolder scaleYProper = PropertyValuesHolder.ofFloat("scaleY", 0f, 1f);
PropertyValuesHolder translationXProper = PropertyValuesHolder.ofFloat("translationX", -100, 100);
PropertyValuesHolder translationYProper = PropertyValuesHolder.ofFloat("translationY", -100, 100);
PropertyValuesHolder rotationProper = PropertyValuesHolder.ofFloat("rotation", 0, 360);
ValueAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imgShow, alphaProper,
scaleXProper, scaleYProper,translationXProper,translationYProper,rotationProper);
animator.setDuration(5000);
animator.start();
AnimatorSet(组合动画)
AnimatorSet 不仅可以同时执行多个动画效果,也可以让多个动画效果按照一定的顺序执行。
AnimatorSet 需要使用的函数
函数及参数 | 含义 |
---|---|
play(Animator anim) | 要实现的动画 |
after(Animator anim) | 将play中的动画放在传入的动画之后实现 |
after(long delay) | 将play中的动画延迟指定毫秒后执行 |
before(Animator anim) | 将play中的动画放在传入的动画之前实现 |
with(Animator anim) | 将play中的动画与传入的动画同时实现 |
实现代码如下:
// AnimatorSet:组合动画可以将多个动画同时执行,也可以按顺序执行。
ObjectAnimator rotate = ObjectAnimator.ofFloat(imgShow, "rotation", 0f, 360f);
ObjectAnimator translationX = ObjectAnimator.ofFloat(imgShow, "translationX", -100, 100f);
ObjectAnimator translationY = ObjectAnimator.ofFloat(imgShow, "translationY", -100, 100f);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(imgShow, "scaleX", 0, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(imgShow, "scaleY", 0, 1f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(imgShow, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate)
.with(alpha)
.with(scaleY)
.after(scaleX)
.after(1000)
.before(translationX)
.before(translationY);
animSet.setDuration(5000);
animSet.start();
动画插入器(Interpolator)
动画插入器:可以通过差值器来控制动画实现的速度。
系统默认的差值器有九种:
差值器名称 | 效果 |
---|---|
AccelerateInterpolator | 加速,开始慢中间加速 |
DecelerateInterpolator | 减速,开始快中间减速 |
AccelerateDecelerateInterpolator | 先加速后减速,开始结束慢,中间快 |
AnticipateInterpolator | 反向,先向相反方向改变在加速执行 |
AnticipateOvershootInterpolator | 反向加超越,先向相反方向,在加速,超出目标值,在缓慢移动至目标值 |
BounceInterpolator | 跳跃,快到目标值是会来回跳跃到目标值 |
CycleInterpolator | 循环,动画循环一定次数 |
LinearInterpolator | 线性,线性匀速改变 |
OvershootInterpolator | 超越,超出目标值,在缓慢移动至目标值 |
除了以上的系统提供的九种插入器,我们也可以自定义 Interpolator 来实现想要的效果。