属性动画

主要的类 ValueAnimator,ObjectAnimator, AnimatorInflater, AnimatorSet , PropertyValuesHolder

ValueAnimator 核心类,需要初始值和结束值,运行的时长,ValueAnimator从初始值平滑地过渡到结束值。
  1. ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); 浮点过渡
  2. anim.setDuration(300);
  3. anim.start();
ValueAnimator.ofInt( 0 , 100 ); 整点过渡

ObjectAnimator 常用,继承自ValueAnimator,可以对对象的属性进行操作了。
ofFloat()参数变化。第一个要执行动画的对象,第二个参数是需要操作的属性例如"alpha"等,后面的参数为
过渡的值(开始到结束,参数个数不定)。

  1. ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
  2. animator.setDuration(5000);
  3. animator.start();



AnimatorInflater 使用XML来编写动画
  1. Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
  2. animator.setTarget(view);
  3. animator.start();


AnimatorSet组合动画
play()方法中传入一个ValueAnimator或ObjectAnimator将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
  • after(Animator anim) 将现有动画插入到传入的动画之后执行
  • after(long delay) 将现有动画延迟指定毫秒后执行
  • before(Animator anim) 将现有动画插入到传入的动画之前执行
  • with(Animator anim) 将现有动画和传入的动画同时执行
  1. ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
上面平移动画后俩个参数表示动画开始和结束时x轴的(像素)偏移量。
  1. ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
  2. ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
  3. AnimatorSet animSet = new AnimatorSet();
  4. animSet.play(rotate).with(fadeInOut).after(moveIn);
  5. animSet.setDuration(5000);
  6. animSet.start();

PropertyValuesHolder 组合动画
ObjectAnimator . ofPropertyValuesHolder()方法内可以放任意多个 PropertyValuesHolder 对象
PropertyValuesHolder 类似 ObjectAnimator对象,但不同点是PropertyValuesHolder 的对象可以当作
ObjectAnimator方法里的参数。

PropertyValuesHolder objectAnimatorScaleX = PropertyValuesHolder . ofFloat( "scaleX" , 0f , 1f ); PropertyValuesHolder objectAnimatorScaleY = PropertyValuesHolder . ofFloat( "scaleY" , 0f , 1f ); /**同时播放两个动画**/ ObjectAnimator . ofPropertyValuesHolder(iv, objectAnimatorScaleX, objectAnimatorScaleY) . setDuration( 1000 ) . start();


控件沿贝塞尔曲线轨迹做动画。
核心代码: ValueAnimator.ofObject(new BezierEvaluator(), new PointF(0,0),new PointF(width,height));
主要用到的类: TypeEvaluator < PointF >,这个类的作用是计算动画当前时间控件所在的位置,它内部只有一个
evaluate(float fraction, PointF startValue, PointF endValue)方法,第一个参数可以理解为当前时间占总时间的比例,根据动画的加速模式自动传入,后两个参数就是ofObject方法参数中的起始值和结束值,在这里我们新建类继承了
TypeEvaluator类,重写evaluate方法, 将动画轨迹写成贝塞尔曲线,这时候将新建类的对象当作动画的主体,并输入贝塞尔起点与终点坐标,这时候所谓的动画其实是不可见的,只是沿着贝塞尔曲线的起点到终点过的的坐标的变化,要实现控件按照曲线移动还需要做一步,对动画监听,获取过程中每个点的位置,并设置给控件,这样就达到了控件按照曲线的移动的动画效果。
监听部分代码
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF pointF = (PointF)animation.getAnimatedValue();
te.setX(pointF.x);
te.setY(pointF.y);
}
});



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值