8
votes

Comment obtenir des degrés de rotation à partir d'un événement multi-touch deux doigt?

J'ai une vision d'image que vous pouvez utiliser pour faire une casserole à un doigt ou une échelle de deux doigts. Ça fonctionne bien. J'ai prolongé de gérer la rotation et son comportement provoque une certaine confusion.

Lorsqu'il y a un événement multi-touch, cette méthode est appelée, ce qui doit renvoyer un angle de rotation en degrés. Il ne fait pas ce que j'attends. xxx

Comme je fais pivoter les deux doigts, je m'attends à des sorties comme ...

158 166 168 169 174 176 179 181 etc

Mais ce que je reçois effectivement, c'est plus comme ça:

158 166 -179 179 -179 179 -179

Le problème semble être avec des signes. Comment cette méthode sait-elle s'il est 180 ou -180, ou 90 ou -270? L'image tourne souvent le mauvais sens, puis saute soudainement et commence soudainement en rotation de la manière opposée. Pire encore, la direction qu'elle tourne initialement est efficacement aléatoire.

Je teste l'application à l'aide d'un Nexus One, mais voyez également le même problème sur une tablette Vega de l'Avent. Les deux périphériques fonctionnent correctement avec Google Maps en 3D pour faire pivoter l'écran (si un peu nerveux parfois), la preuve ne suggère pas une limitation matérielle.

Un problème secondaire est que lorsque les deux doigts sont approximativement verticalement ou horizontalement aligné l'angle ne change tout simplement pas, la rotation "colle" pendant environ 10-20 degrés haut / bas / bas / gauche / gauche / droite.

Je fais actuellement un chèque pour voir si l'angle a soudainement changé une énorme quantité, et si oui, de soustrayer le 360. moche comme l'enfer, mais cela aide un peu.

Espérons que l'un de vous l'a vu avant et sait comment extraire la rotation angulaire D'un geste multi-touch.

Certaines choses d'Android sont si faciles que c'est incroyable, mais des choses comme celles-ci sont gravement douloureuses.


10 commentaires

Je ne sais rien à ce sujet, mais si tout ce que vous avez est 2 points, comment pouvez-vous savoir quoi que ce soit sur la rotation? La rotation doit être relative à un point, n'est-ce pas? N'ayez-vous pas besoin de connaître les coordonnées que la motion a commencé (action_down selon l'Andriod Docs), puis vous entraînez le point central entre eux, puis lorsque vous obtenez des événements de mouvement qui décrivent le mouvement par la suite (et avant que les doigts ne soient soulevés (Action_move Selon ANDRIOD DOCS)) Vous éliminez la rotation de ceux qui sont autour de ce point de centre original ... ou quelque chose suivant ces lignes ...


Je mesure la rotation par rapport à l'angle entre l'axe horizontal et le point de départ de la traînée.


@Olliec fait Cette question aide


Ma suggestion serait d'écrire des tests d'unité que vous pouvez alimenter avec des valeurs que vous connaissez et affirmez les résultats que vous attendez, vous pouvez vous assurer que vous obtenez la fonction fonctionner correctement avant de l'utiliser avec les événements tactiles.


Ne le pense pas. AFAICS Les rotations de l'imageView fonctionnent bien avec des angles de -180 à 180. J'ai essayé d'ajouter 180 à cela, et cela n'a fait aucune différence.


Sam, je demande de l'aide pour approcher de l'écriture de la méthode. Aucune unité d'enregistrement de points essai avant d'avoir une méthode qui a une chance de travailler.


@Ollie c, qu'en est-il de Cette question


Le Entrée Wikipedia doit vous donner des entrées avec des sorties connues (Arctan (1,0) = 0 , arctan (√3,1) = 60 degrés, arctan (0,1) = 90, arctan (0, -1) = 180) etc.)


Sam, appréciez le lien, mais je n'ai pas le temps d'apprendre de vastes quantités de mathématiques, il suffit de faire le projet. J'espère que quelqu'un a déjà vu cela avant et peut me dire la solution, ce que j'attends est facile une fois que vous savez comment vous savez. Je suis toujours surpris qu'il soit tellement difficile de faire quelque chose de si simple.


@Olliec Avez-vous déjà eu ce travail?


4 Réponses :


0
votes

ATAN2 () renvoie une valeur dans la plage (-180 .. + 180).

Compte tenu de cela, cela semble-t-il maintenant fonctionner correctement?

(Si vous êtes à +179 degrés, la rotation de trois degrés supplémentaires sera de +182; mais cela est représenté sous -178)


2 commentaires

Je ne suis pas sûr que cela fait de différence. Le problème n'est pas tant de la gamme de la valeur renvoyée, mais le fait qu'il continue de changer (et de «bâtons» aux quatre axes).


Il est difficile d'évaluer ce que cela fait parce que le comportement a un élément aléatoire à la fois lorsque la traînée démarre (quelle manière) et elle colle ensuite et saute pendant la traînée. Il est très difficile de voir ce qui se passe.



1
votes

Je n'ai jamais rencontré ce problème, mais je suppose que l'utilisation d'Atan2 oblige vos angles de -180 à +180.

Mais la rotation que vous souhaitez appliquer sur votre image doit être de 0 à 360.

La solution la plus facile serait probablement d'ajouter 180 à votre variable de degrés avant de le renvoyer.

EDIT: Depuis que vous avez ajouté dans les commentaires impliqués, je pense que, selon le périphérique que vous travailliez avec vous, vous pouvez rencontrer les infâmes Bug MultiTouch HTC (et autres): http://www.youtube.com/watch?v=DS5QZ_3XRZI Cela le montre pour le Nexus un mais le héros et certains Motorola avaient les mêmes problèmes.


1 commentaires

J'ai édité ma réponse pour ajouter une partie sur le hasard que vous semblez être obtenus.



0
votes

Vérifiez si vous pouvez lire 2 points simultanément et pleinement indépendamment. Je ne sais pas si le Nexus on le fait. Vérifiez cette page:

http://developer.android.com/reference/andrroid/ Contenu / pm / packagemanager.html

et savoir si votre périphérique cible prend en charge Just Feature_Touchscreen_MultiTouch ou mieux (IE Feature_Touchscreen_MultiTouch_Distinct). Probablement plus facile à installer une application de test - je pense avoir utilisé "test visible multitouch".

Si votre appareil ne doit pas alors il n'y a pas de solution ou de contournement. C'est une limitation du conducteur, généralement causée par un choix de merde d'écran tactiles de la part des fabricants de penny-pinching.


1 commentaires

Comme je l'ai dit ci-dessus, je peux faire une rotation à deux doigts dans Google Maps sur le Nexus One, de sorte que l'appareil le supporte. Il est parfois nerveux, mais cela fonctionne. De même pour la tablette, qui, bien que bon marché fonctionne mieux que le Nexus One. Mais mon application ne fonctionne pas correctement du tout.



4
votes

Pour que cela fonctionne comme les utilisateurs s'attendent, vous devez garder un certain état.

Un arc-tangent ne vous indiquera que l'angle entre deux points - un instantané instantané du système. Mais vous effectuez une animation - quelque chose qui se passe au fil du temps.

Donc, je pense que vous êtes sur la bonne voie avec votre solution "laide" qui tente de détecter de gros changements dans l'angle. Ce que vous devriez vraiment suivre le temps, c'est la position de chaque doigt.

Supposons qu'un utilisateur utilise son pouce et son index au geste. Vous devez vous assurer que leurs chiffres sont régulièrement représentés, par ex. Le pouce est toujours représenté par (x < 0 , y 0 ) et l'index par (x 1 , y < / sub>).

Il est probable que l'appareil ait une règle la manière dont chaque coordonnée est rapportée. Par exemple, cela signalera peut-être toujours la coordonnée en haut à gauche dans le logement "0" de l'événement et la coordonnée inférieure droite dans le logement "1". Mais si l'utilisateur déplace son pouce de bas à droite en haut à gauche, vous devez vous assurer que vous le traiterez toujours comme (x << 1 , y ) dans votre Formule d'angle, même si le périphérique le rapporte maintenant comme (x << 0 , y 0 ) dans l'événement. Sinon, l'image apparaîtra rapidement à 180 °, d'avant en arrière.

Si l'appareil ne piste pas des doigts pour vous, vous devrez trouver une heuristique pour deviner. Une simple "laquelle des coordonnées précédentes est plus proche de la coordonnée actuelle" serait un bon endroit pour commencer, mais je pouvais voir la nécessité de quelque chose de favorise si la résolution des événements est médiocre.


1 commentaires

Je suis confronté au même problème. Pouvez-vous m'aider à résoudre ce problème?