属性动画

参考:

        http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html
        http://www.ablanxue.com/prone_4211_2.html

简介:

             android中一共提供了三种动画,帧动画、tween动画以及属性动画。前两种通过不断地调用View的onDraw()改变View的绘制位置,并没有更改view的实际位置。这便带来一个弊端:使用点击事件时,点击事件的响应区域并不一定是view显示出来的区域,而是view在进行动画之前的区域。但属性动画是实际更改对象的区域,不会出现点击区域与显示区域不一致的情况,它是通过更改对象内部的属性进行动画实现的。

       应用属性动画一共需要经过两个步骤:1,计算属性值;2,根据属性值执行相应的动作

ValueAnimator

       ValueAnimator只是完成了属性动画的第一个步骤——计算属性值,因此可以将它理解为数值生成器:不断地生成新的数值,并不对相应的属性进行修改。如果想要完成第二个步骤,我们就需要为它设置监听。如:     

ValueAnimator.addUpdateListener(new AnimatorUpdateListener() {
			public void onAnimationUpdate(ValueAnimator animation) {
				Integer value = (Integer) animation.getAnimatedValue();
				System.out.println("当前动画值:" + value);
			}
		});
        在监听中调用getAnimatedValue(),它得到的是对象的当前属性值,我们可以根据这个属性值进行自己需要的操作。 如果我们不 监听AnimatorUpdateListener() ,ValueAnimator是没有任何意义的。因为它不会自动更改对象的属性。

        在属性动画中,任何属性值都是通过ValueAnimator计算出来的。可以通过调用setInterpolator()设置插值器,调用setEvaluator()设置估值器。

ObjectAnimator

      它继承于ValueAnimator,但是它完成了属性动画的两个步骤,也就是说:它会自动更改对象的属性值。因此,使用它的时候需要一定的限制:使用动画的对象必须具有set和get方法,方便ObjectAnimator为该对象设置或者获取属性值。

TimeInterpolator

        插值器。该类中只有一个方法getInterpolation(float input)。对这个方法简单点解释就是当要执行input的时间时,返回另外一个时间,让系统执行另外一个时间(也即是返回值)的效果 ValueAnimator会根据动画已进行的时间和持续时间的比值,产生一个[0,1]的时间因子,该时间因子就是input。
        它的返回结果会传递到TypeEvaluator.evaluate()中做为第一个参数。如:传入0.1,返回0.2, 这也就是说:我们希望在0.1处获得本应该在0.2处的属性值 。

OvershootInterpolator

        具有反弹效果的插值器。会在动画的最后结束时有一个反弹效果。
        如果ValueAnimator调用了reverse(),那么就在动画开始的时候有一个反弹效果。        

TypeEvaluator

       估值器。它里面只有evaluate()方法。该方法的主要目的:根据传递进行的百分比,计算出在该百分比时,对象的属性应该具有的值
       evaluate()第一个参数来源于:TimeInterpolator的返回值。第二、三个参数是自己设置的动画开始、结束时的值。evaluate()的返回值会是ValueAnimator.getAnimatedValue()的返回值。

总结:

      ValueAnimator根据动画已进行的时间跟动画总时间(duration)的比计算出一个时间因子(0~1,也即是input),然后根据TimeInterpolator计算出另一个因子(即返回值),继而TypeEvaluator通过这个因子计算出属性值(即TypeEvaluator的返回值),最后我们通过 ValueAnimator.getAnimatedValue();得到这个属性值。

View属性:

       1, translationX和translationY:X轴与Y轴方向上移动的距离。可以用该属性控制View的移动。

       2. rotation、rotationX和rotationY:旋转角度。这三个属性控制View对象围绕支点(pivotX,pivotY)进行旋转。

       3. scaleX和scaleY:控制View围绕支点(pivotX,pivotY)进行缩放。

       4. pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。支点的设置时,是以View对象的左上角坐标为原点的

       5. x和y:它描述了View对象在它的容器中的最终位置,它是最初的左上角坐标和translationX和translationY值的累计和。

       6. alpha:它表示View对象的alpha透明度。默认值是1(不透明),0代表完全透明(不可见)。

示例(边移动边旋转):
public void stretchWidth(final View view) {
		// 旋转
		ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(view,
				"rotation", 0, 360);
		//移动,通过translationX属性控件组件在水平方向移动
		ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(view,
				"translationX", 0, view.getX() * 1.5f);

		AnimatorSet set = new AnimatorSet();
		set.playTogether(rotateAnimator, translateAnimator);
		set.setDuration(1000);
		set.start();

	}
使用ValueAnimator的旋转:
public void stretchWidth1(final View view) {
		//设置中心点,相对于view的左上角
		view.setPivotX(0);
		view.setPivotY(0);
		ValueAnimator animator = ValueAnimator.ofObject(new IntEvaluator(), 0,
				360);
               //监听动画的改变,得到当前动画值
                animator.addUpdateListener(new AnimatorUpdateListener() {
			public void onAnimationUpdate(ValueAnimator animation) {
				Integer current = (Integer) animation.getAnimatedValue();
				// view.getLayoutParams().width = current;
				// view.requestLayout();
				view.setRotation(current);
			}
		});
		animator.setDuration(1000);
		animator.start();
	}




  

你可能感兴趣的:(属性动画)