Android开发之用Animator实现动画效果

一、 前言
Android支持两种动画模式,分别为:
1.View Animation:补间动画,给出两个关键帧,通过一些算法将给定属性值在给定时间内在两个关键帧间渐变
2.Frame动画:传统的动画方式,通过顺序的播放排列好的图片来实现,类似与电影的帧动画

而今天将要使用的是Animator框架,Animator框架是Android 4.0新增的一个动画框架,相比于Animation框架,Animator可以进行更多和更精细化的动画控制,而且比之前更简单也更高效。

二、 关键接口介绍

ObjectAnimator
Animator框架封装的比较好,对外提供的接口非常简单,创建一个ObjectAnimator只需要通过静态工厂返回一个ObjectAnimator对象即可,构造方法如下

public static ObjectAnimotor ofFloat(Object target,
String propertyName,float...values)

三个变量分别为要变换的对象、变换的属性名称及变换范围,例如:

X轴变换——

ObjectAnimator oa = ObjectAnimator.ofFloat(view, "translationX", x0,x+x0);

Y轴变换——

ObjectAnimator oa = ObjectAnimator.ofFloat(view, "translationY", y0,y+y0);

绕X轴旋转——

ObjectAnimator oa = ObjectAnimator.ofFloat(view, "rotationX",0F,360F);

AnimatorSet
set是集合的意思,AnimatorSet用于将多个属性动画集合到一起。AnimatorSet提供了4种方法用于集合动画的创建:

1.playSequentially(Animator...items)
2.playSequentially(List<Animator> items)
3.playTogether(Animator...items)
4.playTogether(Collection<Animator> items)

这里可以看出它主要有两种操作类型,sequentially和together,前者用于依次播放动画,而后者用于同时播放动画。

接下来我们看下AnimatorSet提供的Build类。

public class Builder {
        private Node mCurrentNode;

        Builder(Animator anim) {
            mCurrentNode = mNodeMap.get(anim);
            if (mCurrentNode == null) {
                mCurrentNode = new Node(anim);
                mNodeMap.put(anim, mCurrentNode);
                mNodes.add(mCurrentNode);
            }
        }

        public Builder with(Animator anim) {
            Node node = mNodeMap.get(anim);
            if (node == null) {
                node = new Node(anim);
                mNodeMap.put(anim, node);
                mNodes.add(node);
            }
            Dependency dependency = new Dependency(mCurrentNode, Dependency.WITH);
            node.addDependency(dependency);
            return this;
        }

        public Builder before(Animator anim) {
            Node node = mNodeMap.get(anim);
            if (node == null) {
                node = new Node(anim);
                mNodeMap.put(anim, node);
                mNodes.add(node);
            }
            Dependency dependency = new Dependency(mCurrentNode, Dependency.AFTER);
            node.addDependency(dependency);
            return this;
        }

        public Builder after(Animator anim) {
            Node node = mNodeMap.get(anim);
            if (node == null) {
                node = new Node(anim);
                mNodeMap.put(anim, node);
                mNodes.add(node);
            }
            Dependency dependency = new Dependency(node, Dependency.AFTER);
            mCurrentNode.addDependency(dependency);
            return this;
        }

        public Builder after(long delay) {
            // setup dummy ValueAnimator just to run the clock
            ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
            anim.setDuration(delay);
            after(anim);
            return this;
        }
    }

通过查看源码可知,Build类的构造函数不是public的,所以我们只能通过AnimatorSet的play()方法来获得Builder对象。Builder提供了before(),after(),with()等方法,用于调整动画变换的先后顺序,看代码:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 0F,200F);
                ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationY", 0F,300F);
                ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, "rotation", 0F,270F);
                AnimatorSet set = new AnimatorSet();
                set.play(animator2).with(animator1);
                set.play(animator3).after(animator2);
                set.setDuration(1000);
                set.start();

上面的代码会使view同时完成在X轴和Y轴上的移动,完成移动后再完成反转变换。

三、 使用实例
我们可以通过Animator实现自由落体动画

        // 获取屏幕大小
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        // Log.i("height------", dm.heightPixels+"");

        //实现自由落体动画
        ObjectAnimator animator = ObjectAnimator.ofFloat(image,
                            "translationY", 0, 858);
        AnimatorSet set = new AnimatorSet();
        set.setDuration(3000);
        set.setInterpolator(new BounceInterpolator());
        set.play(animator);
        set.start();

这样就实现了自由落体的动画效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值