Android - onTouch(ACTION_MOVE) - 停止退出屏幕的视图

时间:2017-07-18 19:15:26

标签: android ontouchlistener ontouchevent

enter image description here我在这个问题上已经被困了多年,互联网似乎也不想提供帮助。

我有一个自定义视图,我可以使用onTouchListener及其附带的事件在屏幕上拖动。当它退出屏幕时我需要停止此拖动。我有屏幕尺寸,我可以检测到什么时候需要发生一些事情,但我想不出一个“强迫”视图保持在界限的好方法。

如果我设置了一些布尔逻辑,它会冻结视图,使其无法向后拖动。 如果我将点保存到该标记,然后在检测到边界时将视图重新设置为这些,则看起来很糟糕(跳跃)。

我正在寻找视图以保持在界限上,即使用户继续移动他们的手指只是当用户从界限向后拖动时回到“游戏”(如果你得到我?!)。我想的就像一堵想象中的墙......

相关代码如下所示,您可以了解我所处的位置

case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams moveParam = (RelativeLayout.LayoutParams) v.getLayoutParams();

                float maxTop = (mHeight-mPeepHole)/2;
                Log.d(TAG, "onTouch: maxTop = " + maxTop);
                if (moveParam.topMargin > maxTop || moveParam.topMargin < -(mHeight-mPeepHole)/2)
                {
                    Log.d(TAG, "onTouch: OUT OF BOUNDS HEIGHT");
                    // this fires when I need it to, all good.
                    // here is where I need some logic

                }

                if (moveParam.leftMargin > (mWidth-mPeepHole)/2 || moveParam.leftMargin < -(mWidth-mPeepHole)/2)
                {
                    Log.d(TAG, "onTouch: OUT OF BOUNDS WIDTH");
                    // and here...
                }

                moveParam.leftMargin = x - Position_X;
                moveParam.topMargin = y - Position_Y;
                moveParam.rightMargin = -500; // ignore this at present
                moveParam.bottomMargin = -500; // ignore this at present
                v.setLayoutParams(moveParam);

                break;

...

详细说明,x是不应该退出屏幕的中心点。可以从任何点触摸和拖动视图,但是当x到达屏幕边缘时它应该始终停止

1 个答案:

答案 0 :(得分:0)

moveParam.leftMargin = Math.max(0,Math.min(screen_width, x - Position_X- view.getWidth())); 

这样可以防止视图完全脱离屏幕。你基本上做的是不让左边距低于0,或者超过屏幕的末尾。