android 属性动画(ValueAnimator)

本文章,是照着例子做,一边学习一边做的。给自己一份信心

一、属性动画Animator

    操作view的属性进行移动,能够解决一般动画的一些局限性,如, TranslateAnimation移动view之后,该view的一些事件处理还停留在原地,没有更随view进行移动,如下面这个例子.
 
  
public void bClick(View view) {
imageView = (ImageView) findViewById(R.id.iv);
//首先采用一般动画
TranslateAnimation translate = new TranslateAnimation(0, 200, 0, 0);
translate.setDuration(1000); //设置动画时间
translate.setFillAfter(true); //位置更随移动
imageView.startAnimation(translate);
}
图片例子如下


所以需要使用属性动画,来处理一般动画不能解决的问题。
二、属性动画ObjectAnimator的使用
第一种方式:( translationX,  translationY , rotation )
 
   
ObjectAnimator.ofFloat(imageView, "translationX", 0F, 200F).setDuration(1000).start();
//y轴从0移动到200的
ObjectAnimator.ofFloat(imageView, "translationY", 0F, 200F).setDuration(1000).start();
//从0旋转到360度
ObjectAnimator.ofFloat(imageView, "rotation", 0F, 360F).setDuration(1000).start();
第二种方式:
 
   
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("translationX", 0F, 200F);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationY", 0F, 200F);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("rotation", 0F, 360F);
ObjectAnimator.ofPropertyValuesHolder(imageView, p1, p2, p3).setDuration(1000).start();
第三种方式:属性的集合动画
 
   
//第三种属性动画,集合使用,提供了更方便的动画控制效果
AnimatorSet set = new AnimatorSet();
ObjectAnimator obj1 = ObjectAnimator.ofFloat(imageView, "translationX", 0F, 200F);
ObjectAnimator obj2 = ObjectAnimator.ofFloat(imageView, "translationY", 0F, 200F);
ObjectAnimator obj3 = ObjectAnimator.ofFloat(imageView, "rotation", 0F, 360F);
// set.playTogether(obj1, obj2, obj3); //三种属性动画一起移动
// set.start();
// set.playSequentially(obj1, obj2, obj3); //三种属性动画,按照顺序执行
// set.start();
set.play(obj1).with(obj2); //obj1和obj2一起移动
set.play(obj3).after(obj1); //obj3在obj1之后执行
set.start();
三、属性动画的监听
 
   
//第三种属性动画,集合使用,提供了更方便的动画控制效果
AnimatorSet set = new AnimatorSet();
ObjectAnimator obj1 = ObjectAnimator.ofFloat(imageView, "translationX", 0F, 200F);
ObjectAnimator obj2 = ObjectAnimator.ofFloat(imageView, "translationY", 0F, 200F);
ObjectAnimator obj3 = ObjectAnimator.ofFloat(imageView, "rotation", 0F, 360F);
// set.playTogether(obj1, obj2, obj3); //三种属性动画一起移动
// set.start();
// set.playSequentially(obj1, obj2, obj3); //三种属性动画,按照顺序执行
// set.start();
set.play(obj1).with(obj2); //obj1和obj2一起移动
set.play(obj3).after(obj1); //obj3在obj1之后执行
set.start();
set.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animator animation) {
Toast.makeText(MainActivity.this, "结束", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
}
});
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
Toast.makeText(MainActivity.this, "结束", Toast.LENGTH_SHORT).show();
}
});
实现一个扇形弹出菜单的动画效果
四、数值动画(ValueAnimator)
 
   
/**
* 数值发生器ValueAnimator
*
* @param view
*/
public void valueClick(View view) {
final Button button = (Button) view;
// 设置数值
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setDuration(5000);
// 监听ValueAnimator变化
animator.addUpdateListener(new AnimatorUpdateListener() {
 
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取传递的数值
Integer value = (Integer) animation.getAnimatedValue();
button.setText("" + value);
}
});
animator.start();
 
}
总结:执行效率更高,更好
如果一个属性提供了get和set方法,那么我们就可以通过属性动画去掉用这个属性。实现动画效果
常用属性总结:
. translationX\translationY
. rotation、rotationX\rotationY
. scaleX\scaleY (x和y轴方向上的一个缩放动画)
. x\y (具体会移动某一个点)
. apha (透明度)
常用方法、和类
. ValueAnimator 数值发生器,可以很灵活的使用
. ObjectAnimator 封装了ValueAnimator更方便的使用
. AnimatorUpdateListener
. AnimatorListenerAdapter
. PorpertyValuesHolder
. AnimatorSet
. TypeEvaluators 值计算器
. Interpolators 差值计算器
差值器:







猜你喜欢

转载自blog.csdn.net/bianjiyuyan/article/details/42673139