您的位置:首页 > 移动开发 > Android开发

Android 属性动画总小结

2015-08-02 09:13 525 查看
ObjectAnimator的使用:
<pre name="code" class="java">ObjectAnimator a = ObjectAnimator.ofFloat(mImageView, "Y", 0.0F,
360.0F, 0.0f).setDuration(5000);
a.setInterpolator(new BounceInterpolator());
a.start();
这里是对mImageView 的Y坐标进行动画,变化是从0到360再到0;a.setInterpolator(new BounceInterpolator());是添加的弹性效果。ValueAnimator 的使用:
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setDuration(3000);
valueAnimator.setInterpolator(new LinearInterpolator());//添加线性变化率
valueAnimator.setObjectValues(new PointF(0, 0));//添加返回的objiect类型,可以自定义
valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float arg0, PointF arg1, PointF arg2) {
// TODO Auto-generated method stub

PointF pointF = new PointF();
pointF.x = 900 * arg0;
pointF.y = 1000 * 1 / 2 * 9.8f * arg0 * arg0;
return pointF;
}
});
valueAnimator.start();
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {//这里通过监听获取动画返回obeject的值来对view进行处理,实现了动画的效果

@Override
public void onAnimationUpdate(ValueAnimator arg0) {
// TODO Auto-generated method stub
PointF pointF = (PointF) arg0.getAnimatedValue();
mImageView.setX(pointF.x);
mImageView.setY(pointF.y);
}
});
AnimatorSet 实现多个动画同时使用的效果:
ObjectAnimator a = ObjectAnimator.ofFloat(mImageView, "Y", 0.0F,
360.0F, 0.0f).setDuration(5000);
ObjectAnimator a1 = ObjectAnimator.ofFloat(mImageView, "X", 0.0F,
100.0F, 200.0f).setDuration(5000);
a.setInterpolator(new BounceInterpolator());
a1.setInterpolator(new BounceInterpolator());
AnimatorSet set=new AnimatorSet();
set.play(a);
set.play(a1);
set.start();
LayoutTransition  这个是对viewgroup添加与移除view时添加动画:
<pre name="code" class="java">LayoutTransition transition = new LayoutTransition();
transition.setAnimator(LayoutTransition.APPEARING,transition.getAnimator(LayoutTransition.APPEARING));
layout.setLayoutTransition(transition);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
addbt();

});
private void addbt() {
// TODO Auto-generated method stub
Button button = new Button(this);
button.setText("test");
layout.addView(button);
}
LayoutTransition.APPEARING View在ViewGroup中出现时,对这个view设置的动画LayoutTransition.CHANGE_APPEARING View在ViewGroup中出现时,对其他受到影响的viwe设置的动画重点看看Interpolator:用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。先看看AccelerateInterpolator,这个是用于加速的,动画一开始是慢,后面慢慢加快;
ObjectAnimator a = ObjectAnimator.ofFloat(mImageView, "Y", 0.0F,
360.0F, 0.0f).setDuration(5000);
a.setInterpolator(new AccelerateInterpolator());
a.start();
a.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) { // TODO
float c = (float) arg0.getAnimatedValue();
Log.i("=============", c + "");
mImageView.setAlpha(c);
mImageView.setTranslationX(c);
mImageView.setTranslationY(c);
}
});
我们看打印出来的日志就可以看到0开头的个数>1开头的个数>2开头的个数>3开头的个数。。。打印的时候,每个时间间隔是相同的,那么在相同的距离内,开始时走完这个距离的时间要比以后走完这个距离要花的时间长,从他打印了更多的点数可以看得出,发过来看,就是在相同的时间内它走的路程更短了,说明速度慢,后面走到路程更长了,说明速度快,就形成了一个加速的过程。正如这个图显示的那样,x轴的是时间,y轴的是距离,开始第一个距离内,打印了十个点,就是走了十个时间,第二个距离内打印了5个点,走了五个时间第三个距离走了三个时间,第四个距离走了两个时间,明显看到了一个加速的过程。看一下AccelerateInterpolator的源码的核心代码:
public float getInterpolation(float input) {
if (mFactor == 1.0f) {
return input * input;
} else {
return (float)Math.pow(input, mDoubleFactor);
}
可以看到返回的值是输入的平方,而Interpolator:用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。那么就明白了,在一个时间间隔内,本来返回的数值是a,现在返回的是a的平方,数值变小了,当增加到相同间隔的值时,需要花更多的时间了,随着a变大,当增加到相同间隔的值时,花的时间会逐渐变少,因为a变大了,这是我的理解。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: