介绍介绍
属性动画其实跟我们上上一篇讲的视图动画是有一定的相似的,但属性动画更为全面,也更新鲜。顾名思义,属性动画,那就是用影响属性的方法去产生的动画,而且在这里我们执行了动画之后,控件是真的做出了变化(比如位移,位置坐标是真实变化而不是只是做出了一种视图动画效果)。
怎么用
话不多说,先来看看怎么用,毕竟如果连用都还没用上,说多了也只是浪费键盘寿命嘛。
举个栗子
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,三个动画的使用方法都介绍完了,下一篇我们进阶一下,讲讲他们的原理。
网友评论