概述
继上一篇,Android中的视图动画和帧动画可以实现大部分的Android中的动画需求,但是有一个缺点,就是其事件响应区域并没有发生变化,这时候出现了属性动画完全弥补了这个缺点
属性动画结构
可以看到Animator中主要包括AnimatorSet(动画集合),ValueAnimator,ObjectAnimator,
关于属性动画相关api,可以查看这里android.animation,
监听器类
Animator.AnimatorListener
Animator.AnimatorPauseListener,
ValueAnimator.AnimatorUpdateListener
AnimatorListenerAdapter
计算器类
IntEvaluator
FloatEvaluator
ArgbEvaluator
生成相关类
AnimatorInflater
AnimatorSet.Builder
PropertyValuesHolder
ObjectAnimator
ObjectAnimator 不像ValueAnimator 那样需要用户自己来更新属性,会自动跟新,ObjectAnimator 同样可以在xml和代码中设置
xml 设置,需要放在animator目录下
android:duration="3000"
android:propertyName="width"
android:valueFrom="100"
android:valueTo="20"
android:valueType="intType" />
ObjectAnimator objectAnimator =
(ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);
objectAnimator.setTarget(wrapper);
objectAnimator.start();
代码设置
ObjectAnimator animator = ObjectAnimator.ofFloat(_view, "translationX", 300);
animator.setDuration(1000);
animator.start();
ObjectAnimator 提供了ofInt、ofFloat、ofObject.其中可以设置的属性必须提供set/get方法,如果没有,可以通过包装类实现,如下实例
public class ViewWrapper {
private View target; //目标对象
private int maxWidth; //最长宽度值
public ViewWrapper(View target, int maxWidth) {
this.target = target;
this.maxWidth = maxWidth;
}
public int getWidth() {
return target.getLayoutParams().width;
}
public void setWidth(int widthValue) {
//widthValue的值从100到20变化
target.getLayoutParams().width = maxWidth * widthValue / 100;
target.requestLayout();
}
}
ValueAnimator
ValueAnimator类可以为一些动画指定一系列的int,float,color值。通过调用工厂方法ofInt(),ofFloat().ofObject()来获取一个ValueAnimator.但是ValueAnimator需要在监听器中获取属性值,更新相关属性
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorUpdateListener() {
//...这里也可以用AnimatorListenerAdapter,而不用实现每个回调方法
}
PropertyValuesHolder
同时在属性动画中提供了一个快捷方式来创建动画,就是PropertyValuesHolder
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();
TimeAnimator
它没有duration、interpolation以及设置值的方法,提供了一个简单的回调机制,通过 TimeAnimator.TimeListener,在动画的每一帧处通知你
//animation:发出通知的动画
//totalTime:动画开始以来的总时间,以毫秒为单位
//deltaTime:从前一帧到现在的运行时间,以毫秒为单位
onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime)
Interpolators
Interpolator class
Resource ID
Description
AccelerateDecelerateInterpolator
@android:anim/accelerate_decelerate_interpolator
在动画开始与结束时速率改变比较慢,在中间的时候加速
AccelerateInterpolator
@android:anim/accelerate_interpolator
在动画开始时速率改变比较慢,然后开始加速
AnticipateInterpolator
@android:anim/anticipate_interpolator
动画开始的时候向后然后往前抛
AnticipateOvershootInterpolator
@android:anim/anticipate_overshoot_interpolator
动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值
BounceInterpolator
@android:anim/bounce_interpolator
动画结束的时候会弹跳
CycleInterpolator
@android:anim/bounce_interpolator
动画循环做周期运动,速率改变沿着正弦曲线
DecelerateInterpolator
@android:anim/decelerate_interpolator
在动画开始时速率改变比较快,然后开始减速
LinearInterpolator
@android:anim/decelerate_interpolator
动画匀速播放
OvershootInterpolator
@android:anim/overshoot_interpolator
动画向前抛,会抛超过最后值,然后再返回
自定义Interpolator
一: 继承Interpolator或其子类
private class DeceAcceInterpolator implements Interpolator{
@Override public float getInterpolation(float input) {
return ((4*input-2)*(4*input-2)*(4*input-2))/16f + 0.5f;
}
}
二: 自定义xml,更改属性
其中可设置属性包括
Interpolator class
Attribute Name
accelerateInterpolator
android:factor(浮点值,加速的速率,默认为1)
anticipateInterpolator
android:tension(浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了)
anticipateOvershootInterpolator
android:tension(同上),android:extraTension(浮点值,拉力的倍数,默认为1.5,当设为0时,则不会有向后的动画了)
cycleInterpolator
android:cycles (整数值,循环的次数,默认为1)
decelerateInterpolator
android:factor(浮点值,减速的速率,默认为1)
overshootInterpolator
android:tension(浮点值,超出终点后的拉力,默认为2)
示例: