2017-07-18 90 views
0

enter image description here我一直在这个问题上困扰了很多年,互联网似乎也不想帮忙。Android - onTouch(ACTION_MOVE) - 停止退出屏幕的视图

我有一个自定义视图,我可以使用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碰到屏幕边缘

回答

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

这将阻止认为从根本上动过屏幕它应该永远停止。你基本上做的是不让左边距低于0或超过屏幕末端。

+0

这是很好的谢谢。然而,从用户触摸输入x/y开始跟踪,我的项目效果不佳。我的观点是全屏幕,因此可以从任何地方触摸,但它只有屏幕的中心点(宽度/ 2,高度/ 2),我需要包含它。 –

+0

然后不是减去视图宽度,而是减去一半。而不是最大与0,最大与-view.getWidth()/ 2 –

+0

您可以详细说明吗?尽管我感觉我很接近,但我无法让它工作。无论我放置手指的位置如何,检测都能正常工作,但只有在屏幕正中间放置时,视图才会“粘住”。 –