Android - 使用setTransationX()移动按钮

时间:2014-11-01 01:24:24

标签: android button translation

非常简单的问题:

我们假设我们有一个名为btnMove的按钮,我们想要移动它。为了移动它,我想使用setTranslationX和setTranslationY。

为了做到这一点,我写了下面的代码:

    public boolean onTouch(View view, MotionEvent event){

            float currX,currY;
            int action = event.getAction();

            switch (action) {

                   case MotionEvent.ACTION_DOWN: 
                        {
                         mPrevX = event.getRawX();
                         mPrevY = event.getRawY();     
                            break;
                        }

                   case MotionEvent.ACTION_MOVE:
                        {
                         currX = event.getRawX();
                         currY = event.getRawY();

                         btnMove.setTranslationX(currX - mPrevX);
                         btnMove.setTranslationY(currY - mPrevY);   
                            break;
                        }

                        case MotionEvent.ACTION_CANCEL: 
                            break;

                        case MotionEvent.ACTION_UP:
                            break;
                    }

                    return true;

            }

非常简单。我的问题是,一旦我们移动按钮,如果我再次移动它,它将返回到起始位置,然后沿着绘制的矢量移动。事情是我不希望它在移动之前回去,我希望它从我丢弃它的地方移动!

我试图寻找像fillAfter(true)这样的东西,但这似乎只适用于动画。

希望我们能尽快解决这个问题:)

BRO

2 个答案:

答案 0 :(得分:0)

翻译按钮后,您需要将其位置设置为最终位置。

因此,翻译后,请执行此操作...

yourButton.setX(currX - mPrevX);
yourButton.setY(currY - mPrevY);

您的问题是翻译后按钮位置没有变化,因此当您再次翻译它时,它将从原始位置开始。

答案 1 :(得分:0)

我已经尝试设置按钮的X但是我遇到了错误。粘土,仍然使用你的技术,它错了,因为currX - mPrevX是按钮跟随的向量,而不是实际位置。例如,如果您只是单击按钮,向量为0,您的按钮将被发送到位置0.这不是我们想要的。

我可以通过删除setTranslationX并仅使用setX(ButtonPreviousX + Vector)来修复它,见下文。

感谢您的提示

正如我们在代码中看到的那样,我完全放弃了setTranslationX,有人可以解释为什么setTranslationX出错吗?

这是我的最终代码:

public boolean onTouch(View view, MotionEvent event){

             float currX,currY;

                int action = event.getAction();
                switch (action ) {
                    case MotionEvent.ACTION_DOWN: {
                        mPrevX = event.getRawX();
                        mPrevY = event.getRawY();

                        btnPrevX = btnMove.getX();
                        btnPrevY = btnMove.getY();

                        break;
                    }

                    case MotionEvent.ACTION_MOVE:
                    {   
                            currX = event.getRawX();
                            currY = event.getRawY();

                            btnMove.setX(btnPrevX + currX - mPrevX);
                            btnMove.setY(btnPrevY + currY - mPrevY);

                        break;
                    }



                    case MotionEvent.ACTION_CANCEL:
                        break;

                    case MotionEvent.ACTION_UP:
                        break;
                }

                return true;

        }