2013-07-20 2 views
0

J'ai une classe CustomCanvasView qui étend View, et j'ai mis en place en cliquant, en faisant glisser et zoom-pincement pour la classe. Maintenant, je veux implémenter de longs clics.Comment puis-je implémenter des clics longs sur une vue lorsque des coordonnées de clic exactes sont nécessaires?

D'après ce que j'ai lu dans divers postes, tout le monde a une façon different de le faire, mais le consensus général semble être que je devrais utiliser soit un OnLongClickListener ou GestureDetector. Cependant, j'ai besoin des coordonnées exacte du clic long, et je suis inquiet que ces approches ne puissent pas bien jouer avec ce que j'ai travaillé dans ma méthode onTouch().

Alors, quelle approche est vraiment la meilleure pour ces besoins spécifiques?

MISE À JOUR

Alors, j'ai décidé de mesurer le temps manuellement en définissant startTime = System.nanoTime(); dans le ACTION_DOWN cas de mon événement onTouch(...), dans le ACTION_UP cas puis trouver

estimatedTime = System.nanoTime() - startTime; 
seconds = (double) estimatedTime/1000000000.0; 

et d'essais pour voir si cette valeur dépasse 1. Cela a fonctionné, et donc je voulais ajouter des commentaires haptiques. Puisque tout cela est géré à l'intérieur d'une classe (pas une activité), j'ai décidé de passer les informations sur le clic à l'activité associée, et de faire vibrer l'appareil en utilisant un Vibrator dans le cas d'un clic long. Cela fonctionne également, mais, puisque les informations ne sont pas transmises avant la fin du long clic, c'est-à-dire lorsque la vibration se produit.

Dans les applications que j'ai utilisé la rétroaction haptique se produit bien que votre doigt est baissé de sorte que vous pouvez dire que vous avez dépassé le seuil de temps pour un clic long avant vous soulevez votre doigt. Y a-t-il un moyen de le faire sans refaire toute la logique de mon application? Est-ce que je peux vibrer le téléphone d'une classe interne?

MISE À JOUR

Je compris comment faire le retour haptique fonctionne mieux que c'était. Ce n'est toujours pas parfait, mais voici comment je l'ai fait.

Plutôt que de vérifier la valeur de estimatedTime dans le ACTION_UP cas de onTouch(...), je mis un booléen timerStarted égal à true dans le ACTION_DOWN cas, puis au début de onTouch(...) il suffit de vérifier si la minuterie a été lancé, et si oui inspecter la valeur de . Si elle dépasse ma valeur de seuil, je dis à l'activité associée de fournir une rétroaction haptique. J'ai également mis mode = LONG_CLICK donc j'ai cette information dans le cas ACTION_UP. Vous devez juste vous assurer de régler timerStarted = false dans tous les bons endroits (c'est-à-dire si vous déterminez que l'événement est un événement de zoom, un événement de déplacement ou un événement de clic) et vous devriez être bon.

Merci!

Répondre

1

touch sur mesure à long détecter, vous pouvez utiliser TimerTask,

est un exemple de code ci-dessous

public Timer mTIMERForLongTouch; 
Handler mHandler = new Handler(){}; 
int mTIMEForLongTouch=0; 
float longTouchX, longTouchY; 

if(event.getAction()==MotionEvent.ACTION_DOWN) 
{ 
// longTouchX & longTouchY is x-y coordinate of long touch 
longTouchX = event.getX(); 
longTouchY = event.getY(); 
mTIMERForLongTouch = new Timer(); 
mTIMERForLongTouch.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      mTIMEForLongTouch+= 100; 
      if(mTIMEForLongTouch>1500) 
      { 
       mHandler.post(new Runnable() 
       { 
        public void run() 
        { 
         Toast.makeText(context, "Long Touch", Toast.LENGTH_SHORT).show(); 
         mTIMERForLongTouch.cancel(); 
         mTIMEForLongTouch=0; 

        } 
       }); 
      } 
     } 
    }, 0,100); 
} 
else if(event.getAction()==MotionEvent.ACTION_UP) 
{ 
    mTIMEForLongTouch=0; 
    mTIMERForLongTouch.cancel(); 
} 
+0

réponse parfaite. –

Questions connexes