9
votes

Les coordonnées Android Oncheventvent Skip autour

i mon application, j'ai un élément qui oblige l'utilisateur à le déplacer sur l'écran et de le faire, j'utilise un relativelayouout et sur Ontouchlistener.

Le problème que j'ai eu, est-ce à l'intérieur de mon ontchlistener code>, je reçois des résultats étranges pour getex () code> et gety () code>. p>

J'ai ajouté ce qui suit Ligne de code dans mon ouch () code> -> action_move code> bloc: p>

log.v ("exemple", "Touchez: {x : "+ événement.getx () +"} {y: "+ événement.gety () +"} "); code> p>

ci-dessous sont mes résultats de logcat. P>

04-29 03: 16: 11.000: V / MyApp (24188): Touchez!
04-29 03: 16: 11.057: V / MyApp (24188): Touchez: {x: 69.78699} {Y: 107.774216}
04-29 03: 16: 11.103: V / MyApp (24188): Touchez: {x: 77.86926} {y: 173,37648}
04-29 03: 16: 11.158: V / MyApp (24188): Touchez: {x: 69.78699} {y: 108.781845}
04-29 03: 16: 11.205: V / MyApp (24188): Touchez: {x: 77.86926} {y: 174.38597}
04-29 03: 16: 11.463: V / MyApp (24188): Touchez: {x: 69.78699} {y: 109.64778}
04-29 03: 16: 11.502: V / MyApp (24188): Touchez: {x: 77.86926} {y: 175.62172}
04-29 03: 16: 11.596: V / MyApp (24188): Touchez: {x: 69.23099} {Y: 109.40666}
04-29 03: 16: 11.654: V / MyApp (24188): Touchez! P> blockquote>

Comme vous pouvez le constater, déplaçant mon doigt très lentement en ligne droite, je reçois un résultat jumelé, où les coordonnées correctes sont en fait toutes les autres lignes. P>

Ceci entraîne mon Vue de saut de saut et quatrième entre la position souhaitée et la position de décalage lorsque je le fais glisser sur l'écran. P>

J'ai ajouté des chèques pour être sûr que je ne crée qu'un seul élément, ce que cet auditeur est pas appelé de n'importe où autre que cette vue unique. P>

Est-ce que quelqu'un d'autre a vu ce problème auparavant et avoir une idée de ce que je peux faire pour le réparer? P>

Modifier STRT> P>

View.OnTouchListener onTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.d("example", "Touch down");
            break;

        case MotionEvent.ACTION_UP:
            Log.d("example", "Touch up");
            break;

        case MotionEvent.ACTION_MOVE:
            Log.v("example", "Touch: {x:" + event.getX() + " } {y:" + event.getY() + "}");
        }

        return true;    
    }
};


1 commentaires

Je retourne true : code ajouté.


3 Réponses :


3
votes

Revenez-vous réellement à l'intérieur de l'ONTOUCH () après le traitement de l'événement Action_Move? De plus, comme l'explique l'explication officielle Android, "pour l'efficacité des événements de mouvement peut être associé à plusieurs échantillons de mouvement dans un seul objet". Vous devez donc utiliser getx () et gety () uniquement pour récupérer les dernières coordonnées. Pour accéder aux coordonnées précédentes, vous pouvez utiliser les méthodes GetHistoricalX (int) et GetHistoricaly (int). Pour plus d'informations, lisez La référence officielle.


4 commentaires

J'ai ajouté mon code ci-dessus. Je retourne vrai, et je ne suis pas sûr de savoir pourquoi j'aurais besoin de valeurs historiques.


Utilisez-vous un seul doigt lorsque vous faites glisser? Peut-être essayez peut-être de loger Event.gepointCountount (). Et êtes-vous sûr que votre auditeur écoute uniquement les événements d'une vue?


Je vais essayer cela bientôt, mais j'ai pu résoudre mon problème en utilisant event.getrawx () et event.getrawy ()


Ok, très bon, tant mieux !!! Il y a peut-être des problèmes lors de l'utilisation de Coordonnées GetX et Gety et Relatif.



8
votes

J'ai pu résoudre ce problème en utilisant event.getrawx () et event.getrawy () . .


1 commentaires

Merci, j'avais le même problème et cela a vraiment aidé.



2
votes

motionEvent retournera parfois les coordonnées absolues x et y relatifs à la vue, et parfois des coordonnées relatives à l'événement de mouvement précédent. xxx

Raison derrière

@matt Clark Réponse


0 commentaires