Android Animation、ValueAnimator用法介绍

博客讲述了Android中Animation基本用法,有res文件创建XML和代码动态设置两种。针对图片缩放、旋转和平移需求,简单组合动画无法满足,虽可用添加监听事件方式解决,但较繁琐。还介绍了ValueAnimator,其用法与Animation类似,能精确控制动画变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,产生一个效果(注意注释里需要注意的地方):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

//缩放的变化动画

     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,发现直接执行第二次动画,第一次就忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值