Question

Je suis nouveau dans le développement Android et pour le moment je dois prendre une décision de contrôler l'entrée des gestes, mais je ne connais tout simplement pas les avantages et les inconvénients de savoir où saisir l'entrée tactile. On m'a donné deux alternatives, pouvez-vous s'il vous plaît m'expliquer les avantages et les inconvénients de toute façon?

Définir l'écouteur en vue; Mettre en œuvre des méthodes:

faceView.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View arg0, MotionEvent arg1){
     return false;
   }
);

ou

Méthode de remplacement dans la vue

public boolean onTouchEvent(MotionEvent event){
   return false;
}
Était-ce utile?

La solution

Approche 1: type intérieur anonyme.

faceView.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View arg0, MotionEvent arg1){
     return false;
   } 
);

C'est anonyme, car c'est une déclaration sans nom. Il n'y a pas OnTouchListener mytouch =, il n'y a que la déclaration new OnTouchListener(). C'est intérieur, car il se trouve à l'intérieur d'une autre classe, et c'est un type car il s'agit d'une implémentation d'une interface.

Ok, donc avec cet esprit. Cette approche est plus pratique pour les développeurs. La fonctionnalité est isolée (généralement par la déclaration de l'écoute) et cela est facilement géré. Mais cette commodité comporte un coût. Supposons que vous ayez des boutons, avec Ten OnClickListeners. Avec cette approche, la file d'attente de la collection Garbage se remplira plus rapidement avec chaque nouveau type intérieur anonyme.

Mais est-ce important? Pas vraiment. Si vous essayez de retirer chaque microseconde de performances de votre système, alors n'utilisez pas cette approche. Mais généralement, c'est viable.

Approche 2: héritage unique

public boolean onTouchEvent(MotionEvent event){
   return false;
} 

En supposant que vous lisez ce qui précède, cette approche a un coût beaucoup plus faible pour la création et le nettoyage. Il n'y a qu'une seule classe supplémentaire instanciée, et un seul objet ajouté à la file d'attente GC.

C'est l'approche que j'utilise et que j'utilise depuis un certain temps. C'est aussi ce que je vois dans l'exemple de code source de Google.

Mais ce n'est pas parfait! L'implémentation de onTouchEvent finira par regarder comme tel:

public void onTouch(Event e){
if (e.equals(View1)){
}else if (e.equals(View2)){
}else if (e.equals(View 3)){
...}

ALORS

Honnêtement, cela n'a pas d'importance. Si vous voulez les performances les plus élevées possibles, utilisez un auditeur statique OntouchEvent, et vous n'aurez pas à payer les coûts mentionnés ci-dessus, mais pour la plupart, ils ne sont pas si chers de toute façon.

Autres conseils

J'utiliserais personnellement l'auditeur, je l'utilise simplement dans votre méthode onCreate, devrait être bien pour l'instant

Dans la plupart des cas, vous utiliserez probablement le setontouchListener car il offre plus de flexibilité et suit un modèle Java général. Normalement, le remplacement d'OntouchEvent ne serait utilisé que pour les touches qui se produiraient toujours dans une vue et des touches qui ne changeraient pas. Vous devrez également définir la classe de vue pour remplacer OntouchEvent. Lorsque vous utilisez quelque chose comme un bouton, il ne serait pas logique d'avoir à implémenter votre propre classe de bouton juste pour gérer l'événement de clic!

faceview.setontouchListener

Pro

  • Permet une personnalisation facile
  • Suit un modèle Java généralement accepté

Les inconvénients

  • Pourrait entraîner des setteurs inutiles si le comportement ne change pas.

Remplacer Ontouchevent Pro

  • Résume la fonctionnalité dans la classe de base

Les inconvénients

  • Ne permet pas la personnalisation
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top