对于属性动画(Animator),API在11以上的可以直接用属性动画,低版本需要借助第三方库nineoldandroids.
实现方式有2种,1种是通过xml布局中的<set>、<animator>、<objectanimator>。第2种是代码直接设置。
1xml动画布局:
<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>
调用方式:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
2代码直接设置
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(view, "rotationX", 0, 360),//中心X轴旋转
ObjectAnimator.ofFloat(view, "rotationY", 0, 360),//中心Y轴旋转
ObjectAnimator.ofFloat(view, "rotation", 0, 90),//中点旋转
ObjectAnimator.ofFloat(view, "translationX", 0, 90),//右平移
ObjectAnimator.ofFloat(view, "translationY", 0, 90), //下平移
ObjectAnimator.ofFloat(view, "scaleX", 1, 1.5f, 1), //缩放X
ObjectAnimator.ofFloat(view, "scaleY", 1, 1.5f, 1),//缩放Y
ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1) //透明度
);
set.setDuration(5000).start();
不存在get/set的属性动画
官方文档有3种解决方法推荐:
1给对象加上get、set方法;
2用一个类包装原始对象,简介提供get、set方法;
3采用ValueAnimator,监听动画过程,自己实现属
性的改变。
对于第二种和第三种的解决案例如下:
//第二种
ViewWrapper wrapper = new ViewWrapper(view) {
};
ObjectAnimator.ofInt(wrapper, "width", 200, 500).setDuration(3000).start();
//第三种
ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);//百分比
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
private IntEvaluator intEvaluator = new IntEvaluator();
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();//当前进度
float rate = animation.getAnimatedFraction();//获取比例
view.getLayoutParams().width = intEvaluator.evaluate(rate, 200, 500);
view.requestLayout();
}
});
valueAnimator.setDuration(3000).start();
public static abstract class ViewWrapper {
private View view;
public ViewWrapper(View view) {
this.view = view;
}
public int getWidth() {
return view == null ? 0 : view.getLayoutParams().width;
}
public void setWidth(int width) {
view.getLayoutParams().width = width;
view.requestLayout();
}
}