Android 拖放按钮?

Android 拖放按钮?,android,android-layout,Android,Android Layout,我只想在Y方向拖放一个按钮。我实现了这个功能。但它跨越了屏幕边界,消失了。请帮助我实现我的目标 这是我的密码 public class ChoiceTouchListener implements View.OnTouchListener{ @Override public boolean onTouch(View view, MotionEvent motionEvent) { int x = (int) motionEvent.getRawX()

我只想在Y方向拖放一个按钮。我实现了这个功能。但它跨越了屏幕边界,消失了。请帮助我实现我的目标

这是我的密码

    public  class ChoiceTouchListener implements View.OnTouchListener{

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {

        int x = (int) motionEvent.getRawX();
        int y = (int) motionEvent.getRawY();
        DisplayMetrics metrics = getResources().getDisplayMetrics();


        switch (motionEvent.getAction() & MotionEvent.ACTION_MASK){
            case MotionEvent.ACTION_DOWN:
                RelativeLayout.LayoutParams tparams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                changey = y- tparams.topMargin;
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();


                params.topMargin = y-changey;

                view.setLayoutParams(params);
                break;
        }

        rootlayout.invalidate();

        return true;
    }
}

您可以使用此选项将视图限制在屏幕边界

int width=cropperLayout.getLayoutParams().width;;
        int height=cropperLayout.getLayoutParams().height;
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                dX = v.getX() - event.getRawX();
                dY = v.getY() - event.getRawY();

                return true;

            case MotionEvent.ACTION_MOVE:

                if (width == windowWidth && height == windowHeight){}
                else {
                    v.animate()
                            .x(event.getRawX() + dX)
                            .y(event.getRawY() + dY)
                            .setDuration(0)
                            .start();

                    if (event.getRawX() + dX + width > windowWidth) {
                        v.animate()
                                .x(windowWidth - width)
                                .setDuration(0)
                                .start();
                    }
                    if (event.getRawX() + dX < 0) {
                        v.animate()
                                .x(0)
                                .setDuration(0)
                                .start();
                    }
                    if (event.getRawY() + dY + height > windowHeight) {
                        v.animate()
                                .y(windowHeight - height)
                                .setDuration(0)
                                .start();
                    }
                    if (event.getRawY() + dY < 0) {
                        v.animate()
                                .y(0)
                                .setDuration(0)
                                .start();
                    }

                    return true;
                }
int-width=croperLayout.getLayoutParams().width;;
int height=croperLayout.getLayoutParams().height;
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
dX=v.getX()-event.getRawX();
dY=v.getY()-event.getRawY();
返回true;
case MotionEvent.ACTION\u移动:
如果(宽度==窗口宽度和高度==窗口高度){}
否则{
v、 制作动画()
.x(event.getRawX()+dX)
.y(event.getRawY()+dY)
.setDuration(0)
.start();
if(event.getRawX()+dX+width>windowWidth){
v、 制作动画()
.x(窗宽-宽度)
.setDuration(0)
.start();
}
if(event.getRawX()+dX<0){
v、 制作动画()
.x(0)
.setDuration(0)
.start();
}
if(event.getRawY()+dY+height>windowHeight){
v、 制作动画()
.y(窗高-高度)
.setDuration(0)
.start();
}
if(event.getRawY()+dY<0){
v、 制作动画()
.y(0)
.setDuration(0)
.start();
}
返回true;
}

查看onTouch的参数。您可以在onTouch中编写代码,并用view替换v。非常感谢。这对实现我的目标帮助不大