2017-07-18 2 views
0

enter image description here Ich habe seit Jahren zu diesem Thema aufgeklebt und das Internet nicht erscheint entweder helfen zu wollen.Android - OnTouch (ACTION_MOVE) - Stop eine Ansicht von dem Verlassen des Bildschirms

Ich habe eine benutzerdefinierte Ansicht, die ich über den Bildschirm ziehen die onTouchListener und Ereignisse verwenden, die mit ihm gekommen. Ich muss diesen Ziehvorgang anhalten, wenn er den Bildschirm verlässt. Ich habe die Bildschirmabmessungen, und ich kann erkennen, wenn ich etwas brauche zu passieren, aber ich kann nicht glauben, von einem guten Weg zu „zwingen“, um die Ansicht in Grenzen zu bleiben.

Wenn ich eine Boolesche Logik gesetzt friert es die Ansicht, es nicht in der Lage zu machen wegzuziehen zurück. Wenn ich Punkte bis zu dieser Marke speichern und dann den Blick auf diesen neu eingestellt, wenn die Grenzen erkannt werden es sieht schrecklich aus (schreckhaft).

Ich bin auf der Suche nach der Ansicht, um in den Grenzen zu bleiben, auch wenn der Benutzer den Finger bewegt, nur um wieder in "Play" zu kommen, wenn der Benutzer rückwärts aus den Grenzen zieht (wenn Sie mich bekommen ?!). Ich denke, wie eine imaginäre Wand ...

Relevante Code ist unten, so dass Sie die Idee zu bekommen, wo ich bin bei

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; 

...

zu erarbeiten, die x ist der Mittelpunkt, der den Bildschirm nicht verlassen darf. Die Ansicht kann von jedem Punkt berührt und gezogen werden noch sollte es immer stoppen, wenn die x den Bildschirmrand trifft

Antwort

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

, die überhaupt den Blick von dem Losfahren Bildschirm verhindern würde. Was Sie im Grunde tun, ist nicht lassen Sie den linken Rand unter 0 oder bis über das Ende des Bildschirms gehen.

+0

Das ist gut, danke. Aber es funktioniert nicht gut mit meinem Projekt, da es vom Benutzer Touch-Eingabe x/y verfolgt. Meine Ansicht ist Vollbild, so dass man von überall her berühren kann, aber es ist nur der Mittelpunkt des Bildschirms (Breite/2, Höhe/2), den ich enthalten muss. –

+0

Dann subtrahieren Sie, anstatt die Ansichtsbreite zu subtrahieren, die Hälfte davon. Und anstatt mit 0 zu maximieren, max mit -view.getWidth()/2 –

+0

Könnten Sie das näher erläutern? Ich kann es nicht zur Arbeit bringen, obwohl ich fühle, dass ich nah dran bin. Die Erkennung funktioniert unabhängig davon, wo ich meinen Finger lege, aber die Ansicht wird nur "haften", wenn sie genau in der Mitte des Bildschirms platziert wird. –

Verwandte Themen