Android 属性动画总小结

来源:互联网 发布:郑州学软件 编辑:程序博客网 时间:2024/05/17 13:42


ObjectAnimator的使用:

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>() {@Overridepublic PointF evaluate(float arg0, PointF arg1, PointF arg2) {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进行处理,实现了动画的效果@Overridepublic void onAnimationUpdate(ValueAnimator arg0) {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时添加动画:

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() {@Overridepublic void onClick(View arg0) {addbt();});private void addbt() {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() {@Overridepublic void onAnimationUpdate(ValueAnimator arg0) { 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变大了,这是我的理解。



0 0
原创粉丝点击