2010-09-24 43 views
3

But de l'application:MotionEvent événements tactiles multiples se mélangent et se influencent (voir la vidéo démo)

Une application simple qui dessine un cercle pour chaque touche reconnu à l'écran et suit les événements tactiles. Sur une «lecture haute pression» getPressure (int pointerIndex) la couleur du cercle va changer et le rayon va augmenter. De plus, l'ID tactile avec getPointerId (int pointerIndex), les coordonnées x et y et la pression sont affichés à côté du doigt.

Après une snipplet de code de la part importante (s'il vous plaît pardonnez-moi ce n'est pas le code plus beau;) je sais)

protected void onDraw(Canvas canvas){ 

    //draw circle only when finger(s) is on screen and moves 
    if(iTouchAction == (MotionEvent.ACTION_MOVE)){ 
     int x,y; 
     float pressure; 

     //Draw circle for every touch 
     for (int i = 0; i < touchEvent.getPointerCount(); i++){ 
      x = (int)touchEvent.getX(i); 
      y = (int)touchEvent.getY(i); 
      pressure = touchEvent.getPressure(i); 

      //High pressure 
      if (pressure > 0.25){ 
       canvas.drawCircle(x, y, z+30, pressureColor); 
       canvas.drawText(""+touchEvent.getPointerId(i)+" | "+x+"/"+y, x+90, y-80, touchColor); 
       canvas.drawText(""+pressure, x+90, y-55, pressureColor); 
      }else{ //normal touch event 
       canvas.drawCircle(x, y, z, touchColor); 
       canvas.drawText(""+touchEvent.getPointerId(i)+" | "+x+"/"+y, x+60, y-50, touchColor); 
       canvas.drawText(""+pressure, x+60, y-25, pressureColor); 
      } 
     }   
    } 
} 

Le problème:

Un HTC Desire sous Android 2.1 est la plate-forme de test. L'application fonctionne bien et suit deux doigts sans problème. Mais il semble que les deux points de contact interfèrent l'un avec l'autre quand ils se rapprochent - il semble qu'ils tournent sur un axe x et y partagé. Parfois, ils échangent même les coordonnées d'entrée de l'autre événement tactile. Un autre problème est que même si getPressure (int pointerIndex) se réfère à un PointerID, les deux événements tactiles ont la même lecture de pression.

Comme cela est un peu abstrait, trouver une vidéo ici: http://www.youtube.com/watch?v=bFxjFexrclU

Ma question:

  1. mon code tout simplement mal?
  2. Est-ce que Android 2.1 ne gère pas assez bien les événements tactiles?
  3. Est-ce un problème matériel et n'a rien à voir avec 1) et 2)?

Merci pour les réponses et/ou les liens vers d'autres threads (désolé pourrait trouver un qui résout ce problème).

Chris

+0

J'ai certainement déjà vu ça. Je pense que c'est juste juste que ça ne marche pas bien avec le multitouch. Essayez votre code sur un téléphone 2.2 si vous le pouvez. – Falmarri

+0

Merci pour ce Falmarri !!! Il semble que le matériel est également un problème. Cette vidéo compare le Google Nexus One et le Samsung Galaxy S et ce dernier n'a pas de problèmes avec l'application similaire à la mienne! http://www.youtube.com/watch?v=hVlsRCMltDg&feature=player_embedded – chriz

Répondre

3

Je déteste te le dire, mais c'est votre matériel.

L'écran tactile utilisé dans le Nexus One (que je crois est le même matériel utilisé dans le HTC Desire) est connu pour cet artefact particulier. Nous avons fait un peu de travail pour alléger le problème "saute à l'autre doigt" autour des événements ACTION_POINTER_UP/DOWN pour Android 2.2 en supprimant certains mauvais événements détectables, mais le problème persiste quand les pointeurs se rapprochent le long d'un axe. Ce panneau est également connu pour inverser aléatoirement les données de coordonnées X et Y; deux points (x0, y0) et (x1, y1) deviennent (x0, y1) et (x1, y0). Malheureusement, il y a tellement de choses que vous pouvez faire lorsque les «vraies» données sont perdues au moment où Android lui-même s'en empare.

Ce n'est pas le seul panneau dans la nature qui a des capacités multitouch douteuses. Pour indiquer à l'exécution si vous disposez d'un écran capable de générer des rapports multitouch précis sans problèmes de ce type, utilisez PackageManager pour rechercher FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT. Si vous ne disposez pas de cette fonctionnalité, vous pouvez toujours effectuer des opérations simples, telles que des mouvements d'échelle fiables.

+0

Wow Adamp, merci pour beaucoup c'était aussi mon soupçon, quand j'ai vu une autre vidéo avec des problèmes similaires! Va vérifier 'FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT' pour mes appareils disponibles. Je me demandais comment savoir sur la plate-forme matérielle et ses capacités multitouch sans acheter l'appareil en réalité ?! Pour le projet de recherche sur lequel nous travaillons, nous n'avons pas encore décidé de la plate-forme actuelle. Le système Android a le 'getPressure (int pointerIndex)' mais a du mal avec le multitouch - les produits iOS ont de bonnes capacités multitouch mais aucune API publique pour lire la pseudo pression sur l'écran? Pensées? – chriz

+0

voir ce lien pour la lecture de pseudo-pression pour l'iPHone: http://stackoverflow.com/questions/3316358/ipad-measure-detect-covered-area-by-a-finger-touch-on-screen-not-only- Touch-Coo – chriz

1

Quelqu'un a essayé this fix for multitouch gestures sur des androïdes plus anciens avant? Je prévois de l'évaluer pour my own project, car il traite également de android 1.x/2.x buggy multitouch.

Luke semble avoir couvert le problème décrit ici ainsi que d'autres problèmes courants d'entrée tactile sur les dispositifs pré-3.x.

J'espère que ça aide, à votre santé.