上一篇给大家带来了视图动画中的补间动画,今天给大家简单的介绍一下PropertyAnimation属性动画中的ValueAnimator
视图动画和属性动画区别
- 引入时间不同:View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才开始有Property Animation相关的API。
- 所在包名不同:View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
- 动画类的命名不同:View Animation中动画类取名都叫XXXXAnimation,而在Property Animator中动画类的取名则叫XXXXAnimator
- 视图动画只是改变控件的状态并没有改变控件的属性,二属性动画直接改变控件的属性
补间动画举例来康康效果:
从图中可以看出:
- 点击移动到的位置根本不起作用,这也证实了,他只是改变动画的’肉体’,控件的’灵魂’还在原来的地方
属性动画效果;
大家可以很直观的看到,最后控件移动到什么位置,他就在什么位置,不会出现在原来位置才出现点击事件的效果.
属性动画ValueAnimator.onInt使用
有参数构造
ValueAnimator.ofInt(int… values)
//设置移动的位置
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400,200,600);
valueAnimator.setDuration(2000);
//通过addUpdateListener来监听ofInt的变化
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue();
Log.i("szjanimatedValue",animatedValue+"");
//将值设置给TextView对象
tv.layout(animatedValue,animatedValue,tv.getWidth()+animatedValue,tv.getHeight()+animatedValue);
}
});
valueAnimator.start();
大家可以看到,弹出的Log就是先从0 ->400->200->600
属性动画ValueAnimator.onFloat使用
有参构造:
ValueAnimator.ofFloat(float… values)
这里和ofInt使用基本类似,只是传的参数不同,onInt是int类型,onFloat是float类型,
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 400f,200f,600f,405.2f,202.1f,600f);
valueAnimator.setDuration(2000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//因为这里咋们使用的是ofFloat所以得强制转换成Float
Float animated = (Float) animation.getAnimatedValue();
Log.i("szjanimatedValue",animated+"");
int animatedValue = animated.intValue();//转换为int类型设置给tv
tv.layout(animatedValue,animatedValue,tv.getWidth()+animatedValue,tv.getHeight()+animatedValue);
}
});
valueAnimator.start();
来康康onFloat的效果吧:
onInt和onFloat总结:
常用方法:
设置动画时长,单位是毫秒
ValueAnimator setDuration(long duration)
获取ValueAnimator在运动时,当前运动点的值
Object getAnimatedValue();
开始动画
void start()
设置循环次数,设置为INFINITE表示无限循环
void setRepeatCount(int value)
* 设置循环模式
* value取值有RESTART,REVERSE
void setRepeatMode(int value)
取消动画
void cancel()
setRepeatCount()和setRepeatMode()使用
这里我设置的是:
valueAnimator.setRepeatCount(3);//执行三次
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);//反转
监听方法
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获取ValueAnimator在运动时,当前运动点的值
Object animated =animation.getAnimatedValue();
});
animation.getAnimatedValue();//获取ValueAnimator在运动时,当前运动点的值
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//最开始执行
Log.i("szjjListener:","start");
}
@Override
public void onAnimationEnd(Animator animation) {
//执行完之后在执行
Log.i("szjjListener","End");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.i("szjjListener","Cancel");
}
@Override
public void onAnimationRepeat(Animator animation) {
//没执行一次执行 在start后执行
Log.i("szjjListener","Repeat");
}
});
因为valueAnimator.setRepeatCount(3);//执行三次
所以这里onAnimationRepeat()执行了3次
取消监听
/** * 移除AnimatorUpdateListener */
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners();
/** * 移除AnimatorListener */
void removeListener(AnimatorListener listener);
void removeAllListeners();
valueAnimator.removeAllListeners();
效果:
来看看Log把:
通过Log可以看出,只要设置了valueAnimator.removeAllListeners();就会立即停止,不会接着往下执行正常情况下会是0f–>400–>200f–>600f–>405.2f–>202.1f–>600f
克隆与延时操作
延时多久时间开始,单位是毫秒
public void setStartDelay(long startDelay)
完全克隆一个ValueAnimator实例,包括它所有的设置以及所有对监听器代码的处理
public ValueAnimator clone()
使用:
注意:得先有valueAnimator控件才能克隆,否则的话会null
ValueAnimator clone = valueAnimator.clone();//克隆
clone.setStartDelay(2000);//设置2s后执行
clone.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//因为这里咋们使用的是ofFloat所以得强制转换成Float
Float animated = (Float) animation.getAnimatedValue();
Log.i("szjanimatedValue",animated+"");
int animatedValue = animated.intValue();//转换为int类型设置给tv
tv.layout(animatedValue,animatedValue,tv.getWidth()+animatedValue,tv.getHeight()+animatedValue);
}
});
clone.start();
来康康效果吧:
先获取原控件,然后在点击克隆
感谢大家的观看,有不同观点请在评论区留言~