Android 属性动画总小结


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变大了,这是我的理解。



你可能感兴趣的:(Android 属性动画总小结)