6
votes

Sauter ImageView en traînant. getX () et gety () les valeurs sautent

J'ai créé un Ontouchlistener pour faire glisser des vues. Les images font glisser doucement si j'utilise getrawx () code> et getrawy () code>. Le problème de celui-ci est l'image passera au deuxième pointeur lorsque vous placez un deuxième pointeur vers le bas, puis soulevez le premier pointeur.

Cet OOUTETOUCHLISTENER tente de résoudre ce problème en gardant une trace du code> Pointerid code>. Le problème avec cet Ontouchlistener est tout en faisant glisser une vision d'image, l'imageView saute autour de jolie follement. Le getx () code> et gety () code> Les valeurs sautent autour de vous. P>

Je me sens comme si je le fais correctement. Je ne veux pas avoir à écrire une vue personnalisée pour cela, car j'ai déjà mis en œuvre une échelle échelle et écrit un tournez-rotateduredetector personnalisé qui fonctionne. Tout fonctionne bien, mais je dois résoudre le problème que j'obtiens lorsque vous utilisez getrawx () code> et getrawy () code>. P>

Est-ce que quelqu'un sait ce que je suis Faire mal ici? P>

Voici mon OOUTEOUCHLISTENER: P>

final View.OnTouchListener onTouchListener = new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        relativeLayoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();

        final int action = event.getAction();
        switch (action & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
            {
                final float x = event.getX();
                final float y = event.getY();

                // Where the user started the drag
                lastX = x;
                lastY = y;
                activePointerId = event.getPointerId(0);
                break;
            }
            case MotionEvent.ACTION_MOVE:
            {
                // Where the user's finger is during the drag
                final int pointerIndex = event.findPointerIndex(activePointerId);
                final float x = event.getX(pointerIndex);
                final float y = event.getY(pointerIndex);

                // Calculate change in x and change in y
                final float dx = x - lastX;
                final float dy = y - lastY;

                // Update the margins to move the view
                relativeLayoutParams.leftMargin += dx;
                relativeLayoutParams.topMargin += dy;
                v.setLayoutParams(relativeLayoutParams);

                // Save where the user's finger was for the next ACTION_MOVE
                lastX = x;
                lastY = y;

                v.invalidate();
                break;
            }
            case MotionEvent.ACTION_UP:
            {
                activePointerId = INVALID_POINTER_ID;
                break;
            }
            case MotionEvent.ACTION_CANCEL:
            {
                activePointerId = INVALID_POINTER_ID;
                break;
            }
            case MotionEvent.ACTION_POINTER_UP:
            {
                // Extract the index of the pointer that left the touch sensor
                final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                final int pointerId = event.getPointerId(pointerIndex);

                if(pointerId == activePointerId)
                {
                    // This was our active pointer going up. Choose a new
                    // active pointer and adjust accordingly
                    final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                    lastX = (int) event.getX(newPointerIndex);
                    lastY = (int) event.getY(newPointerIndex);
                    activePointerId = event.getPointerId(newPointerIndex);
                }
                break;
            }
        }
        return true;
    }
};
image1.setOnTouchListener(onTouchListener);


1 commentaires

Quelqu'un a une solution à cela? On dirait que d'autres ont rencontré cette question, mais je n'ai pas encore trouvé de solution.


3 Réponses :


0
votes

J'ai un conseil et pense que cela aidera.

invalidate() : does only redrawing a view,doesn't change view size/position.


2 commentaires

J'ai essayé de supprimer v.invalidate () dans le passé (essayé à nouveau juste depuis que vous l'avez suggéré) depuis que je pensais qu'il était inutile dans ce scénario, n'aide pas cependant. J'ai essayé de le remplacer par v.requestlayout () et qui n'a pas changé le comportement non plus: / Toute autre suggestion?


Ou essayez d'utiliser la vue View.Layout (gauche, haut, droite, bas) au lieu de régler layoutParams.



12
votes

Le problème était simple, mais inattendu. GetRAWX / Y () CODE> Retourne les coordonnées absolues, tandis que getx / y () code> retourne les coordonnées relatives à la vue. Je déplacerais la vue, réinitialiser lastx / y code>, et l'image ne serait plus dans le même endroit, alors quand j'obtiens de nouvelles valeurs qu'ils étaient éteintes. Dans ce cas, j'avais seulement besoin d'où je à l'origine fort> appuyé sur l'image (pas le cas lorsque vous utilisez `getrawx / y ').

Donc, la solution consistait à supprimer simplement les éléments suivants: P>

// Save where the user's finger was for the next ACTION_MOVE
lastX = x;
lastY = y;


5 commentaires

Heureux que j'ai trouvé ça! Je soupçonne que beaucoup de gens ont du code pour sauver le berx / lasty en raison de la lecture Android-Developers.Blogspot.com/2010/06/... . Apparemment, la situation de déplacement d'une vue diffère de l'exemple de "MultiTouch" où une toile est en cours de traduction. Le dernier commentaire ici, Stackoverflow.com/Questtions/16676097/... , note que lorsqu'il a commenté le réglage de la vue.setx () et vue.Sety (), l'entrelacement des coordonnées absolues et relatives au cours de l'AOULD () arrêté.


@ T.Folsom Heureux que je puisse aider! Oui, beaucoup de gens modélisent leur code après votre premier lien, moi-même inclus. Pour autant que je sache, getx () et gety () retourne toujours des coordonnées relatives. Ses coordonnées sautent pour la même raison que moi. Il déplace la vue puis obtient différentes coordonnées relatives car la vue a changé. Cela a-t-il du sens?


Oui, cela aidé plus de personnes :)


2019, toujours utile. J'ai le code d'échantillon de la documentation officielle ( développeur.android.com/training/gestures/ Échelle ) et hérité de ce problème. Merci!


@Vasiliy merveilleux :) Je suis content que la réponse ait tenu



1
votes

Après beaucoup de recherches, j'ai trouvé que ceci soit le problème, Getrawx est absolu et GetX est relatif à la vue. Par conséquent, utilisez ceci pour transformer l'un à l'autre xxx


0 commentaires