转载请注明http://blog.csdn.net/u014163726/article/details/41210951
前文也提到过Android 3.0以后引入了属性动画,属性动画可以轻而易举的办到许多View动画做不到的事,今天我们就来学习一下属性动画。
前文提到过View动画只是改变了View的绘制效果,而属性动画则是真正的改变一个属性,效果如下图。
对比Android 动画详解之View动画我们可以看到明显的区别,那么属性动画究竟是怎么用的呢,莫慌,接下来代码奉上。
1,ObjectAnimator
属性动画用起来并不复杂可以说比View动画还简单了很多,上面的平移动画
//mButton:对象 //TranslationY:属性 //300偏移量 ObjectAnimator.ofFloat(mButton, "TranslationY",300) .setDuration(2000).start();
一句话而已就实现了平移动画,但属性动画能办到的并不止如此,我们修改一个属性看看。
// mButton:对象 // TranslationY:属性 // 300偏移量 ObjectAnimator.ofFloat(mButton, "RotationY", 360) .setDuration(2000).start();
可能看到这很多人都有疑惑了,这个传的属性名究竟是什么,其实使用ObjectAnimator必须指定一个对象以及一个对象属性,也就是要有get&set函数,如果没有的话是不能是用ObjectAnimator,但是我们可以使用另外一种ValueAnimator。
2,ValueAnimator
我们还是先来看个例子,用ValueAnimator完成上面的效果,该怎么做呢。
ValueAnimator valueAnimator = ValueAnimator.ofFloat(360); valueAnimator.setDuration(2000);
眼熟吧。。但是这样是没有办法用的,因为没有指定对象以及属性,如果想要完成动画效果需要实现ValueAnimator.onUpdateListener接口。
ValueAnimator valueAnimator = ValueAnimator.ofFloat(360); valueAnimator.setDuration(2000); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mButton.setRotationY((Float) animation .getAnimatedValue()); } });
通过animation.getAnimatedValue()可以得到根据时间以及偏移量计算出来的当前属性值,拿到当前属性值之后我们自然是想干什么就干什么啦,顺带一提ObjectAnimator就是继承ValueAnimator。
3,AnimatorSet
我们的属性动画当然是有set功能的,而且用法很有意思。
AnimatorSet animatorSet = new AnimatorSet(); ValueAnimator valueAnimator = ValueAnimator.ofFloat(360); valueAnimator.setDuration(2000); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mImageView.setRotationY((Float) animation .getAnimatedValue()); } }); animatorSet.play(valueAnimator).with( ObjectAnimator.ofFloat(v, "RotationY", 360) .setDuration(2000)); animatorSet.start();
animatorSet.play是添加动画.with是同时播放还有.before.after相信大家都知道是干什么的了,但这只能是同时播放不同对象的动画,如果我们想让同一对象同时改变属性应该怎么做呢。
4,ViewPropertyAnimator
同时调用RotationX和RotationY,哈哈是不是很有快感。
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("RotationX", 360f); PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("RotationY", 360f); ObjectAnimator.ofPropertyValuesHolder(v, p1, p2).setDuration(2000).start();
关于属性动画还有很有意思的东西没有介绍,我们留在下一期!