为什么在我使用ObjectAnimator 到View.TRANSLATION_X 后视图的位置总是重置?

Why the location of view always resets after I use ObjectAnimator to View.TRANSLATION_X?

我创建了一个简单的应用程序,只是希望当我单击一个按钮时,图像视图会移动到另一个位置。

下面是代码,但似乎当我点击按钮时,图像视图总是从原始位置开始,而不是真正的位置。我的代码有问题吗?

public class MainActivity extends Activity{

private ImageView iv;
private Button bt;
private AnimatorSet mAniSet;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ddd);
    iv = (ImageView) this.findViewById(R.id.imageView1);
    bt = (Button) this.findViewById(R.id.button1);
    mAniSet = new AnimatorSet();

    bt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            int pointOnScreen[] = new int[2];
            iv.getLocationOnScreen(pointOnScreen);

            ObjectAnimator AniTranslationX = ObjectAnimator.ofFloat(iv, View.TRANSLATION_X, pointOnScreen[0]+100);
            mAniSet.playTogether(AniTranslationX);
            mAniSet.setTarget(iv);
            mAniSet.setDuration(200).start();
        }           
    });
}

}

如果你创建一个ObjectAnimator.ofFloat(Object, 属性, values)并且只有一个值,那么动画的原点就是0f。

可以找到源码进入class android.animation.KeyFrameSet和下面的方法:

public static KeyframeSet ofFloat(float... values) {
        boolean badValue = false;
        int numKeyframes = values.length;
        FloatKeyframe keyframes[] = new FloatKeyframe[Math.max(numKeyframes,2)];
        if (numKeyframes == 1) {
            keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f);
            keyframes[1] = (FloatKeyframe) Keyframe.ofFloat(1f, values[0]);
            if (Float.isNaN(values[0])) {
                badValue = true;
            }
        } else {
            keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f, values[0]);
            for (int i = 1; i < numKeyframes; ++i) {
                keyframes[i] =
                        (FloatKeyframe) Keyframe.ofFloat((float) i / (numKeyframes - 1), values[i]);
                if (Float.isNaN(values[i])) {
                    badValue = true;
                }
            }
        }
        if (badValue) {
            Log.w("Animator", "Bad value (NaN) in float animator");
        }
        return new FloatKeyframeSet(keyframes);
    }

可以看到,只有一个值,动画的开始是0f(关键帧[0])。

如果您输入 2 个值,您的动画将从第一个值开始并在第二个值停止:

ObjectAnimator AniTranslationX = ObjectAnimator.ofFloat(iv, View.TRANSLATION_X, pointOnScreen[0], pointOnScreen[0] + 100);

如果有 3 个或更多值,动画将在动画运行期间达到所有这些值。