2012-09-12 1 views
2

Aujourd'hui, j'ai un problème avec la gestion des événements tactiles sur les vues personnalisées android.Dans ce cas, j'ai créé parent view appel vue de la semaine et appel chillé weeklyview.je veux mettre en œuvre l'événement tactile comme singleTap, LongPress en mode enfant uniquement et lorsque je balaye un parent ou un enfant, je veux faire défiler la vue parent. Lorsque j'implémente un événement tactile dans les deux vues, cela ne fonctionne pas.Gestion des événements tactiles sur les vues personnalisées android parent et enfant

enter image description here

quelqu'un peut me aider this.It est vraiment utile pour moi. Merci

+0

Je pense que si l'événement tactile est vue enfant, la vue parente ne sera jamais notifiée. Mieux vaut donc utiliser GestureDetector, à l'intérieur de votre vue enfant, onTouchEvent, envoyer l'événement à un geste, et le traiter sur la vue parente. – Tom

+0

J'utilise GestureDetector dans les deux vue la partie de défilement est faite sur la vue parent et c'est OK.but je veux faire quelque chose sur la vue enfant. Je renvoie false dans la méthode onDown dans child view.then scroll parent travaille et touche l'événement sur la vue enfant dose ne fonctionne pas – Sanath

Répondre

0

Définissez votre vélocité de balayage (pour détecter l'intention de l'utilisateur de balayer) et remplacez le onTouchEvent() dans votre vue enfant. Ici, appelez super.onTouchEvent() et retour, qui appelle votre vue parent. Gérer les événements dans la vue parent.

2
class ChildView extends View { 


    public void setGestureDetector (GestureDetector g) 
    { 
     gesture = g; 
    } 

    @Override 
    public boolean onTouchEvent (....) 
    { 
     return gesture.onTouchEvent (....); // touch event will dispatch to gesture 
    } 
} 

class ParentView extends View implements GestureDetector.OnGestureListener { 

    gesture = new GestureDetector (this); 

    child = new ChildView (...); 
    child.setGestureDetector (gesture); 

    @Override 
    public boolean onTouchEvent (..) 
    { 
     // handle your parent touch event here 
    } 

    public boolean onDown (...) 
    { 
     return true; 
    } 

    public boolean fling (...) 
    { 
     // here to handle child view fling 
    } 


} 

Ce code est peso (pas réel android java) pour vous montrer le concept à utiliser GestureDetector, vous pouvez traiter tous les événements de votre point de vue des enfants dans votre vue parent. Comme je l'ai testé sur mon téléphone android, onTouchEvent dans ChildView ne reconnaissait pas ACTION_UP très bien, donc même si vous balayez votre vue enfant, parfois fling ne fonctionnera pas (cela dépend de ACTION_UP).

Donc, si vous voulez écrire plus précis swipe sur votre vue enfant, mieux écrire votre owen Gesture Détecte la classe, et dans votre ChildView, vous pouvez le faire -

float oldX; 
float distanceX; 

public boolean onTouchEvent (MotionEvent event...) 
{ 
    if (event.getAction == MotionEvent.ACTION_DOWN) { 
     // handle down 
     oldX = event.getX(); 
    } 

    if (event.getAction == MotionEvent.ACTION_MOVE { 
     // handle move 
     distanceX = event.getX() - oldX; // more accurate 

     gesture.onSwipe (distanceX); // your own gesture class 
    } 


} 
+0

J'utilise quelque chose de très proche de cette implémentation.J'ai créé un détecteur de gestes sur le parent et l'enfant.Est-ce différent de votre méthode. – Sanath

+0

Je pense que la vue enfant enverra l'événement à votre parentview, donc vous pouvez faire face à fling (swipe), aussi dans votre vue parent ontouchevent, vous pouvez aussi gérer swipe, retourner vrai dans votre événement onDown. J'ai fait le simliar, et je sais que le fling a un bug, parfois dans mon téléphone android, l'onTouchEvent ne peut pas très bien reconnaître ACTION_UP, donc le fling ne se déclenchera pas cette fois. – Tom

+0

désolé j'ai écrit mauvais codes – Tom

Questions connexes