Android 动画和过渡

Android Animation and transitioning

下面的代码应该是:

当我触摸屏幕时,按钮从左上角移动到右下角。如果我再次触摸屏幕,按钮将从右下移动到左上。

但实际情况是,当我触摸屏幕时,按钮开始从 TL 移动到 BR,但随后又跳回到 TL 角!

我触摸屏幕的时间越长,按钮 "travels" 朝向 BL 角的时间就越长。 这是为什么?我必须更改什么才能使按钮在我第一次触摸屏幕时向一个方向移动,而在我第二次触摸屏幕时向另一个方向移动?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    state = false;
    myLayout = (ViewGroup)findViewById(R.id.main_layout);
    myLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            moveButton();
            return true;
        }
    });
}

public   void moveButton() {
        View theButton = findViewById(R.id.button1);

        TransitionManager.beginDelayedTransition(myLayout); //for smooth transitioning

        //Change position
        RelativeLayout.LayoutParams posRules = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
        if ( state)         {
            posRules.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            posRules.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

        }
        else {
            posRules.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            posRules.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        }

        theButton.setLayoutParams(posRules);

        //Change size
        ViewGroup.LayoutParams sizeRules = theButton.getLayoutParams();
        if ( state) {
            sizeRules.width = 250;
            sizeRules.height = 100;

        }
        else {
            sizeRules.width = 450;
            sizeRules.height = 300;
        }
        theButton.setLayoutParams(sizeRules);

        state = !state;
    }

每个触摸事件都会调用onTouchListener。例如,当您触摸屏幕时,会发送 ACTION_DOWN。当您抬起手指时,会发送 ACTION_UP。您可以找到所有事件的解释 here.

现在,您每次触摸屏幕时至少会收到两次 onTouchListener 呼叫。为了让它每次触摸只动画一次,我会做类似下面的事情来只在按下触摸事件时执行。

myLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            moveButton();
        }
        return true;
    }
});