2017-07-18 7 views
0

enter image description here J'ai été bloqué pendant des lustres sur cette question et l'Internet ne semble pas vouloir aider non plus.Android - onTouch (ACTION_MOVE) - Arrêter une vue de quitter l'écran

J'ai une vue personnalisée que je peux faire glisser autour de l'écran en utilisant l'onTouchListener et les événements qui l'accompagnent. J'ai besoin de ce glisser pour arrêter quand il quitte l'écran. J'ai les dimensions de l'écran et je peux détecter quand j'ai besoin de quelque chose, mais je ne peux pas penser à un bon moyen de "forcer" la vue à rester dans les limites.

Si je définis une logique booléenne, la vue est figée, ce qui l'empêche de glisser vers l'arrière. Si je sauvegarde des points jusqu'à cette marque, puis que je les redéfinisse lorsque les limites sont détectées, cela semble horrible (sautant). Je cherche la vue pour rester sur les limites même si l'utilisateur ne cesse de bouger son doigt pour revenir en "jeu" quand l'utilisateur se traîne en arrière des limites (si tu m'obtiens ?!). Je pense comme un mur imaginaire ...

code correspondant est ci-dessous afin que vous pouvez obtenir l'idée de là où je suis

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; 

...

Pour élaborer, x est le point central qui ne devrait pas pouvoir quitter l'écran. La vue peut être touché et traîné hors de tout point mais il doit toujours arrêter quand x touche le bord de l'écran

Répondre

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

qui empêcheraient la vue de se déplacer hors de l'écran du tout. Ce que vous faites essentiellement, c'est de ne pas laisser la marge de gauche passer en dessous de 0, ou plus que la fin de l'écran.

+0

C'est bon merci. Cependant, cela ne fonctionne pas très bien avec mon projet car il suit l'entrée tactile de l'utilisateur x/y. Ma vue est en plein écran si touchable de n'importe où mais c'est seulement le point central de l'écran (width/2, height/2) que j'ai besoin de contenir. –

+0

Ensuite, au lieu de soustraire la largeur de la vue, soustrayez la moitié de celle-ci. Et au lieu de maxing avec 0, max avec -view.getWidth()/2 –

+0

Pourriez-vous élaborer? Je ne peux pas le faire fonctionner, même si je me sens proche. La détection fonctionne quel que soit l'endroit où je place mon doigt, mais la vue ne «colle» que lorsqu'elle est placée exactement au milieu de l'écran. –