Android Animation、ValueAnimator用法介绍

  Animation 基本用法在我原来初学andorid时候讲过http://www.cnblogs.com/bokeofzp/p/4759030.html,基本方法有2种:1、res文件中创建anim文件夹,并添加XMl设置animation属性,2、代码中动态设置。但在做项目中设计到了一个需求,就是当图片在缩放到0.5f的时候需要开始旋转和平移图片。

  这里我们不能简单的定义一个缩放动画和一个旋转动画然后同时启动这2个动画来达到想要的效果。

当然我们也可以利用上面的方式来解决:

  1、写一个动画,从0-0.5的缩放。

  2、在上面的动画添加监听事件,当结束的时候添加一个旋转动画,并且 还得再添加一个缩放动画,从0.5f缩放到1f。

通过上面的方式可以完成,但总感觉怪怪的,为了更精确的让图片在多大时候执行什么事情,或者其他的动画,在旋转多少度的时候做什么事情,查了一些资料,发现android还提供了一个动画类:ValueAnimator。

大致用法其实和Animation的用法差不多,给出一个方法,实现的是当图片缩放到1的时候回缩到0.95,产生一个效果(注意注释里需要注意的地方):

//缩放的变化动画
     public static  void scaleAnimate(final View view , float start , final float end , final int duration)
     {
     final ValueAnimator valueAnimator = ValueAnimator.ofFloat(start , end);
     valueAnimator.setDuration(duration);
     valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
      //这里在值变化的时候做相应的动作,我们是缩放图片,注意先设置缩放的起始点,坐标都是以view的左上角为原点
             float value = (float) animation.getAnimatedValue();
             view.setPivotX(view.getWidth()/2);
             view.setPivotY(view.getHeight()/2);
             view.setScaleX(value);
             view.setScaleY(value);
         }
     });
     //动画完成后有个缩小的动作
     valueAnimator.addListener(new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
             //这里写是有问题的,递归调用会重新启动监听,然后又会启动,因为动画只启动一次的缘故,但是会持续执行onUpdateListener,且value值一直是0.95
//             scaleAnimate(view, end, 0.95f, duration / 3);
             ScaleAnimation scaleAnimation = new ScaleAnimation(1 , 0.95f , 1 , 0.95f , view.getWidth()/2 , view.getHeight()/2);
             scaleAnimation.setDuration(duration);
             scaleAnimation.setFillAfter(true);//这是保证动画后的效果,不然会恢复到原来大小。
             view.startAnimation(scaleAnimation);
         }
     });
     valueAnimator.start();
 }

 ValueAnimator.ofFloat(start , end);来返回一个ValueAnimate对象,其实还有相应的ofInt,ofArgb、ofObject、ofPropertyValuesHolder等,它主要是可以在设置了动画的变化参数后,精确的在动画变化的时候控制动画做我们想做的事情。

 ps:当连续调用2次旋转动画的时候第一次从0-90,第二次是90-180,发现直接执行第二次动画,第一次就忽略。

原文地址:https://www.cnblogs.com/bokeofzp/p/6923846.html