转载请注明http://blog.youkuaiyun.com/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();
关于属性动画还有很有意思的东西没有介绍,我们留在下一期!