android中一共提供了三种动画,帧动画、tween动画以及属性动画。前两种通过不断地调用View的onDraw()改变View的绘制位置,并没有更改view的实际位置。这便带来一个弊端:使用点击事件时,点击事件的响应区域并不一定是view显示出来的区域,而是view在进行动画之前的区域。但属性动画是实际更改对象的区域,不会出现点击区域与显示区域不一致的情况,它是通过更改对象内部的属性进行动画实现的。
应用属性动画一共需要经过两个步骤:1,计算属性值;2,根据属性值执行相应的动作。
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()设置估值器。
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(); }