接口 | 说明 |
---|---|
Animator.AnimatorListener | 监听动画的四个(开始,结束,暂停,重复)状态,接口中有四个方法分别监听四个状态 |
Animator.AnimatorPauseListener | 当动画被暂停,或者动画从暂停后已恢复时调用 |
LayoutTransition.TransitionListener | 该接口用于监听转场的开始和结束事件 |
ValueAnimator.AnimatorUpdateListener | 监听动画过程中值的实时变化,每当值变化就回调此接口 |
类 | 说明 |
---|---|
ArgbEvaluator | 估值器 |
FloatEvaluator | 类似上面 |
IntEvaluator | 类似上面 |
FloatArrayEvaluator | 类似上面 |
IntArrayEvaluator | 类似上面 |
PointFEvaluator | 类似上面 |
RectEvaluator | 类似上面 |
ObjectAnimator | 动画具体操作类 |
TimeAnimator | 如上 |
ValueAnimator | 如上 |
Object evaluate(float fraction, Object startValue, Object endValue)
ArgbEvaluator argbEvaluator = new ArgbEvaluator();
Button button = new Button(this);
for(int i = 0;i < 10;i++){
try {
Thread.sleep(100);
int c = (int) argbEvaluator.evaluate((float) i/10, 0x00f0f0, 0xffffff);
button.setBackgroundColor(c);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ValueAnimator animator = ValueAnimator.ofFloat(0f,400f,50f,300f);
animator.setDuration(3000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float curValueFloat = (Float)animation.getAnimatedValue();
int curValue = curValueFloat.intValue();
tv.layout(curValue,curValue,curValue+tv.getWidth(),curValue+tv.getHeight());
}
});
animator.start();
ofInt(int... values)
ofArgb(int... values)
ofObject(TypeEvaluator evaluator, Object... values)
ofPropertyValuesHolder(PropertyValuesHolder... values)
/**
* 设置动画时长,单位是毫秒
*/
ValueAnimator setDuration(long duration)
/**
* 获取ValueAnimator在运动时,当前运动点的值
*/
Object getAnimatedValue();
/**
* 开始动画
*/
void start()
/**
* 设置循环次数,设置为INFINITE表示无限循环
*/
void setRepeatCount(int value)
/**
* 设置循环模式
* value取值有RESTART,REVERSE,
*/
void setRepeatMode(int value)
/**
* 取消动画
*/
void cancel()
/**
* 延时多久时间开始,单位是毫秒
*/
public void setStartDelay(long startDelay)
/**
* 完全克隆一个ValueAnimator实例,包括它所有的设置以及所有对监听器代码的处理
*/
public ValueAnimator clone()
/**
* 监听器一:监听动画变化时的实时值
*/
public static interface AnimatorUpdateListener {
void onAnimationUpdate(ValueAnimator animation);
}
//添加方法为:public void addUpdateListener(AnimatorUpdateListener listener)
/**
* 监听器二:监听动画变化时四个状态
*/
public static interface AnimatorListener {
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
//添加方法为:public void addListener(AnimatorListener listener)
/**
* 移除AnimatorUpdateListener
*/
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners();
/**
* 移除AnimatorListener
*/
void removeListener(AnimatorListener listener);
void removeAllListeners();
propertyBt = findViewById(R.id.main_PropertyBt);
final ValueAnimator animator = ValueAnimator.ofFloat(0,400,100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float i = (float) animation.getAnimatedValue();
int it = i.intValue();
propertyBt.layout(it,it,it+propertyBt.getWidth(),it+propertyBt.getHeight());
}
});
animator.setDuration(3000);
propertyBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animator.start();
}
});
没啥难度,看下效果
额,视频转码有点问题,不过效果是可以看出来了,结合代码我们也能很容易的理解,所谓属性动画,其实就是给我们包装了一个工具类而已,将我们需要的数字间距或者颜色间距之类的给我们分隔好,然后控件的属性我们自己去改变
嗯,到这里我们是不是有点抓住什么了呢,属性动画的实现是返回给我们一系列的值供我们处理,而我们在前面刚看到的估值器是返回给我们指定进度的值,那么这两者之间?
对,没错,属性动画内部的处理器就是用这个估值器这个类干的,之所以有不同的类型,所谓术业有专攻嘛,毕竟颜色代码的估值可不是跟整型估值一样 安卓还为我们提供了自定义估值器的接口
看一下官方给我们的解释
TypeEvaluator 用于该功能的接口。 setEvaluator(TypeEvaluator)
public class MyEvaluator implements TypeEvaluator<Integer> {
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int) (endValue - fraction * (endValue - startInt));
}
}
public interface TimeInterpolator {
float getInterpolation(float input);
}
animator.setInterpolator(new TimeInterpolator() {
@Override
public float getInterpolation(float input) {
float i;
if(input > 0.5){
i = (float) (0.01 + (1 - 0.01) * ((input - 0.5) / (1 - 0.01)));
}else {
i = (float) (0 + (0.01 - 0) * ((input - 0) / (0.01)));
}
return i;
}
});
animator.setEvaluator(new TypeEvaluator() {
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + (fraction) * (endValue - startInt));
}
});
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values);