美文网首页
Android动画-属性动画Property Animation

Android动画-属性动画Property Animation

作者: 广州萧敬腾 | 来源:发表于2019-04-03 11:43 被阅读0次

介绍介绍

属性动画其实跟我们上上一篇讲的视图动画是有一定的相似的,但属性动画更为全面,也更新鲜。顾名思义,属性动画,那就是用影响属性的方法去产生的动画,而且在这里我们执行了动画之后,控件是真的做出了变化(比如位移,位置坐标是真实变化而不是只是做出了一种视图动画效果)。

怎么用

话不多说,先来看看怎么用,毕竟如果连用都还没用上,说多了也只是浪费键盘寿命嘛。
举个栗子

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha",1f, 0f, 1f, 0f, 1f, 0f, 1f);
animator.setDuration(2000);
animator.start();

是不是很熟悉,没错跟视图动画的用法是非常接近的。
如果是多种动画效果混合呢,来这样写

float curTranslationY = textview.getTranslationY();
ObjectAnimator translationY = ObjectAnimator.ofFloat(tvTest, "translationY", curTranslationY, curTranslationY + 500f);

ObjectAnimator scaleY = ObjectAnimator.ofFloat(tvTest, "scaleY", 1f, 5f, 1f);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(tvTest, "scaleX", 1f, 5f, 1f);

AnimatorSet animSet = new AnimatorSet();
animSet.play(scaleY).with(scaleX).after(translationY);
animSet.setDuration(2000);
animSet.start();

这里面包含了垂直移动、水平缩放、垂直缩放三种效果,诶,这个什么Play、with、after都是些什么鬼,来我们了解一下这些方法,至于这些"translationY"、"scaleY“、"scaleX"是什么鬼,其实这些是有规则的,简单粗暴来讲是一个方法名,具体原理我们往后一篇讲原理的文章会讲到这些,如果你不知道你需要的效果对应的方法名叫啥,百度嘛~我这样一个个列出来很累诶,我就抛砖引玉一下乖!

play()方法表示要播放的动画,方法会有一个AnimatorSet.Builder的返回值,所以只能通过这个方法获取到我们的builder。
with()方法表示跟前面的方法一起执行
after()方法表示先执行这个动画再执行前面动画
before()方法表示执行前面的动画后才执行该动画
after()方法还有一个重载,传入一个long值,表示延迟n毫秒之后执行动画

大家试一试应该就能理解这些方法顺序了,这种方式相比而言会比较自由,可以自己设置动画顺序,如果你懒或者动画效果顺序比较简单,可以看看另外两个方法,说不定已经可以满足你的功能,来看代码

AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(scaleY, scaleX, translationY);
        animatorSet.setDuration(2000);
        animatorSet.start();

顾名思义,playTogether就是一起执行的意思,这样设置之后这三个动画会一起执行
还有一种按顺序执行,只要把这个方法改成

animatorSet.playSequentially(scaleY, scaleX, translationY)

那么这三组动画就会按照顺序来执行

监听器

我们可以给动画设置一个监听器,比如我们给上面的一个scaleY动画设置一个监听器,则

scaleY.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
    //当AnimatorSet开始时调用
    }

    @Override
    public void onAnimationEnd(Animator animation) {
    //当AnimatorSet结束时调用
    }

    @Override
    public void onAnimationCancel(Animator animation) {
    //当AnimatorSet被取消时调用
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
    //当AnimatorSet重复时调用,由于AnimatorSet没有设置repeat的函数,所以这个方法永远不会被调用
    }
});

ViewPropertyAnimator

这个是谷歌官方在3.1的时候对动画的一个补充,他可以直接链式调用,看起来很爽,而且也拥有更好的性能(因为多个属性一起同时变化,只执行一次invalidate),我们来找一个对比,就拿上面的playTogether()方法来比较

AnimatorSet set = new AnimatorSet();
set.playTogether( ObjectAnimator.ofFloat(btn,"alpha",0.5f),
        ObjectAnimator.ofFloat(btn,"rotation",360),
        ObjectAnimator.ofFloat(btn,"scaleX",1.5f),
        ObjectAnimator.ofFloat(btn,"scaleY",1.5f),
        ObjectAnimator.ofFloat(btn,"translationX",0,50),
        ObjectAnimator.ofFloat(btn,"translationY",0,50)
);
set.setDuration(5000).start();
------------------------------分割线------------------------------
btn.animate().alpha(0.5f).rotation(360).scaleX(1.5f).scaleY(1.5f)
              .translationX(50).translationY(50).setDuration(5000);

没错,就是这么精简,而且精简的同时性能更好
其中里面的方法如果是加By的,比如rotationXBy,那么是从自身的值去开始改动,比如rotationXBy(20)那就是在自身的值上旋转20度,再执行一次就是40度,而rotationX(20)的话是旋转到20度,你再执行就没效果了因为已经20度了
具体的方法调用说明其实方法名已经很明显了,如果不确定可以查查文档,如果不想查文档那就用你的控件view.animate().出来去里面翻一翻,总有你想要的。

ok,三个动画的使用方法都介绍完了,下一篇我们进阶一下,讲讲他们的原理。

相关文章

网友评论

      本文标题:Android动画-属性动画Property Animation

      本文链接:https://www.haomeiwen.com/subject/bssabqtx.html