2010-09-30 5 views
21

je la hiérarchie suivante: Activity ->PopupWindow ->CustomViewAndroid: délèguent événement tactile pour voir underlaying

Mon la PopupWindow lui-même est un carré, mais transparent, de sorte que vous pouvez voir l'activité assis en arrière-plan. Le CustomView est un cercle incorporé dans le PopupWindow. alt text

Ce que j'ai accompli jusqu'à présent est

  1. utilisateur clique sur le cercle vert et j'invoquez « des trucs »
  2. utilisateur clique en dehors de la PopupWindow et l'événement touche obtient dépêchés sur les activités.

La partie manquante est maintenant, à envoyer tout événement tactile qui se passe à l'intérieur du PopupWindow mais en dehors du CustomView (cercle) à l'activité.

Je sais déjà comment sentir quand le toucher est en dehors de mon cercle. J'ai juste des problèmes pour le déléguer à l'activité.

Dans mon CustomView j'ai les éléments suivants dans onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

Dans mon PopupWindow je déjà configuré ce qui suit, mais il ne fait jamais appelé:

popup.setTouchInterceptor(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.i(TAG, "PopupWindow :: onTouch()"); 
     return false; 
    } 
}); 

tout ce que je dois faire pour déléguer l'événement tactile tout le chemin à l'activité?

+3

comment avez-vous créé ce mockup?c'est joli – browep

+1

Comment avez-vous réussi à envoyer les événements de clic aux vues ci-dessous le PopUpWindow? – Mannaz

+1

Mocups ont été réalisés par des maquettes balsamiques http://balsamiq.com/products/mockups/ –

Répondre

0

Il est dommage que PopupWindow ne soit pas une sous-classe de ViewGroup ou même View. Ensuite, vous pouvez remplacer dispatchTouchEvent. Pouvez-vous modifier votre vue personnalisée pour en savoir plus sur PopupWindow et appeler dismiss() quand il y a un clic en dehors du cercle?

12

Tenir compte du FLAG_NOT_TOUCH_MODAL:

/** Window flag: Even when this window is focusable (its 
    * {@link #FLAG_NOT_FOCUSABLE is not set), allow any pointer events 
    * outside of the window to be sent to the windows behind it. Otherwise 
    * it will consume all pointer events itself, regardless of whether they 
    * are inside of the window. */ 
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020; 

Vous pouvez utiliser ce code pour Upate les drapeaux de fenêtre après la fenêtre pop-up a été affichée.

FrameLayout popupContainer = (FrameLayout)contentView.getParent(); 
WindowManager.LayoutParams p = (WindowManager.LayoutParams)popupContainer.getLayoutParams(); 
p.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); 
windowManager.updateViewLayout(popupContainer, p); 
+0

Ok. Ça marche. Je peux toucher les deux vues dans 'popupWindow' et les vues de l'activité. Juste 'updateViewLayout (contentView, p)', pas 'contentView.getParent()' – Yeung

3

Essayez le réglage ceux-ci sur votre instance popupWindow:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

et

window.setTouchable(true);

Ceci est juste une suggestion ... Je pas testé. Dites-moi si cela fonctionne.

[Note: Ceci est la OnTouch() pour obtenir appelé sur les événements tactiles ..]

Questions connexes