2013-07-24 2 views
4

J'ai implémenté GestureDetector dans mon Activity. En ce moment, je peux saisir tous les événements de l'écran tout comme onSingleTapConfirmed, onDoubleTap, onLongPress ...Obtenir la vue qui est touchée avec GestureDetector

Est-il possible de détecter, ce qui View de ma mise en page personnalisée a été pressé?

Répondre

1

Dans Android vous avez le code source de la plate-forme, donc je recommanderais de voir comment les ViewGroups de base sont implémentés et d'apprendre d'eux.

Examinons la source pour ViewGroup disponible here. Recherchez la fonction dispatchTouchEvent(). Il fait à peu près ce que vous cherchez à faire.

Pour déterminer quelle vue a été tapée, elle parcourt toutes les sous-vues, demande le hitrect pour chaque vue et vérifie si elle est pertinente. Code:

for (int i = count - 1; i >= 0; i--) { 
    final View child = children[i]; 
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 
     || child.getAnimation() != null) { 
     child.getHitRect(frame); 
     if (frame.contains(scrolledXInt, scrolledYInt)) { 

Je ne peux que vous suggérer de faire quelque chose de similaire.

Je suppose que vous ne voudrez pas faire cette itération manuelle (ou récursion puisque vous voulez probablement aller dans les vues dans les vues) parce que, avouons-le, c'est assez dégoûtant. Dans ce cas, peut-être que vous pouvez laisser le mécanisme régulier faire son charme (laisser l'événement couler dans les sous-vues comme il le ferait normalement). Ensuite, définissez les gestionnaires d'événements sur les vues spécifiques que vous souhaitez gérer, et laissez votre gestionnaire être appelé et vous notifier de quelle manière la vue a été sélectionnée.

Une autre chose intéressante à garder à l'esprit est que les dispositions personnalisées peuvent implémenter des transformations statiques pour leurs sous-vues avec ViewGroup.setStaticTransformationsEnabled(). J'ai utilisé ces transformations quand j'ai implémenté un carrousel de vue 3D. Quand c'est le cas, je suis sûr que ce que vous voulez faire est impossible. Les sous-vues ne savent pas vraiment où elles se trouvent car les transformations statiques les amènent ailleurs à l'écran. Dans ce cas, vous êtes sous la grâce de la mise en page personnalisée pour distribuer les événements à ses sous-vues correctement pour vous.

+0

La deuxième solution semble être meilleure. Je vais essayer d'aller dans cette direction. – hsz

Questions connexes