2017-07-18 65 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

您可以詳細說明嗎?儘管我感覺我很接近,但我無法讓它工作。無論我放置手指的位置如何,檢測都能正常工作,但只有在屏幕正中間放置時,視圖纔會「粘住」。 –