Android 如何使动画的代码更有效?

Android 如何使动画的代码更有效?,android,xml,android-animation,android-xml,Android,Xml,Android Animation,Android Xml,此代码通过ObjectAnimator和AnimationSets在按钮单击时切换两个视图(mView1和mView2)的y位置。平移动画时,两个视图的alpha值将减小并再次增长。这只是一个设置,以发挥周围的一点。alpha动画是用XML定义的,而translate动画是用代码完成的 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/and

此代码通过
ObjectAnimator
AnimationSet
s在按钮单击时切换两个视图(mView1和mView2)的
y位置。平移动画时,两个视图的
alpha
值将减小并再次增长。这只是一个设置,以发挥周围的一点。alpha动画是用XML定义的,而translate动画是用代码完成的

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="0.5"
        android:valueType="floatType"/>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1.0"
        android:valueType="floatType"/>
</set>
现在,因为这是预期的工作,我想知道如何缩短代码

  • 对于每个使用XML动画的
    视图
    ,是否真的需要有一个单独的
    动画集
    实例?我可以将xml膨胀一次并在不同的AnimatorSet/ObjectAnimators上使用它吗?因为我没有找到一个以动画师为参数的setter

  • 我可以为一个AnimationSet/ObjectAnimator定义多个目标吗?还是为视图定义不同的ObjectAnimator并在AnimationSet中使用它们的唯一方法


您将希望将动画代码放入已设置动画的类中。。。像这样:

public class FadingView extends View {

    private ObjectAnimator fade, moveX, moveY;
    private AnimatorSet moveSet;

    public FadingView(Context context) {
        super(context);
    }

    private void fade(int duration, float...values) {

        if(fade==null) {
            fade = ObjectAnimator.ofFloat(this, "alpha", values);
        } else {
            fade.setFloatValues(values);
        }
        fade.setDuration(duration);
        fade.start();

    }

    private void move(int duration, int x, int y) {

        if(moveX==null) {
            moveX = ObjectAnimator.ofFloat(this, "translation_x", x);
        } else {
            moveX.setFloatValues(x);
        }
        if(moveY==null) {
            moveY = ObjectAnimator.ofFloat(this, "translation_y", y);
        } else {
            moveY.setFloatValues(y);
        }
        if(moveSet == null) {
            moveSet = new AnimatorSet();
            moveSet.playTogether(moveX, moveY);
        }

        moveSet.setDuration(duration);
        moveSet.start();

    }

    public void moveToUpperLeft(int duration) {
        move(duration, 0,0);
    }

    public void show(int duration) {
        fade(duration,1);
    }

    public void hide(int duration) {
        fade(duration,0);
    }

}
这只是一个基本示例,但现在您可以调用:

FadingView view = new FadingView(context);
view.hide(500);
view.moveToUpperLeft(500);
当然,你可以定制和推广这甚至更多

FadingView view = new FadingView(context);
view.hide(500);
view.moveToUpperLeft(500);