android 当对象有多个属性的话,或者要实现的动画比较复杂,需要对View的多个属性进行动画,那么,按照之前的做法就是需要创建多个ValueAnimator或者ObjectAnimator,然后把他们放在AnimatorSet中,这样就显得冗余繁琐。
android 给了其他的解决方案:
propertyValueHolder 针对所有对象
// 将showbutton 做成呼吸按钮的动画
// 变小,变淡------变大,显示
PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.5f, 0.1f,
0.5f, 1f);
PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 1f, 0.5f, 0.1f,
0.5f, 1f);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(showButton,
alphaHolder, scaleXHolder, scaleYHolder).setDuration(3000);
objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
objectAnimator.start();
ViewPropertyAnimator
如果要同时变换一个View的多个属性的话,ViewPropertyAnimator提供了一种更方便和更适合的方法。
而且由于多个属性的invalidate方法调用统一管理,而不是之前的分别调用,所以还会有一些性能优化。
注意
ViewPropertyAnimator
这个类的对象不是由调用者构造的,而是通过View类的animate()方法返回的。该类是多属性动画,从名字就可以看出该类的作用对象是view,当一个view对象需要同时执行多个属性动画的时候就可以考虑使用该类了。比如说:一个ImageView先右移动的同时进行放大一倍的动画效果实现如下:
<span style="white-space:pre"> </span>myView.animate().x(50f).y(100f);
KeyFrame
这个类是通过控制time/value键值对来实现动画效果的。Keyframe类里面实现的 ofInt,ofFloat,ofObject方法。来看看ofFloat(float fraction, float value)第一个参数表示动画完成度,值在0—1之间变化。第二个参数表示当前帧动画的值。还不明白那就来点简单粗暴的吧。动画向右平移200个像素之后又移动回原来位置的动画
<span style="white-space:pre"> </span>Keyframe keyframe1 = Keyframe.ofFloat(0f, 0f);
Keyframe keyframe2 = Keyframe.ofFloat(0.9999f, 360f);
Keyframe keyframe3 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("rotation",
keyframe1, keyframe2, keyframe3);
ObjectAnimator change_disappearingAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
pvh_left, pvh_top, pvh_right, pvh_buttom, propertyValuesHolder).setDuration(
xmlTransition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
xmlTransition
.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, change_disappearingAnimator);
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" >
</objectAnimator>
</set>
</set>
</set>
其中
android:ordering="sequentially"
控制串行,就是他的一级子项里的内容顺序执行;
android:ordering="together"
控制并行,就是他的一级子项的内容同事执行。
写完xml文件,我们就可以在代码中调用了:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
动画部分,先记到这里,以后遇到再往里面添加新内容。