2010-09-30 12 views
21

ho la seguente gerarchia: Activity ->PopupWindow ->CustomViewAndroid: delegare evento di tocco alla visualizzazione underlaying

mio il PopupWindow è di per sé una piazza, ma trasparente, in modo da poter vedere l'attività seduta in background. Lo CustomView è un cerchio incorporato all'interno di PopupWindow. alt text

Quello che ho ottenuto finora è

  1. utente fa clic sul cerchio verde e invoco "alcune cose"
  2. utente fa clic all'esterno del PopupWindow e l'evento di tocco ottiene inviati per posta Activity.

La parte mancante è ora, di inviare qualsiasi evento di tocco che accade all'interno del PopupWindow, ma al di fuori del CustomView (cerchio) per l'attività.

So già come percepire quando il tocco è fuori dalla mia cerchia. Ho solo problemi a delegarlo all'attività.

Nel mio CustomView Ho il seguente in onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

Nel mio PopupWindow ho già impostare le seguenti, ma ottiene mai chiamato:

popup.setTouchInterceptor(new OnTouchListener() { 

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

C'è altro che devo fare a delegare l'evento di tocco fino all'attività?

+3

come è stato creato il mockup?è abbastanza elegante – browep

+1

Come sei riuscito a inviare gli eventi click alle visualizzazioni sotto PopUpWindow? – Mannaz

+1

I mocup sono stati creati da mockup balsamici http://balsamiq.com/products/mockups/ –

risposta

0

È un peccato che PopupWindow non sia una sottoclasse di ViewGroup o di View. Quindi potresti sovrascrivere dispatchTouchEvent. Puoi modificare la tua vista personalizzata per sapere di PopupWindow e chiamarla conged() su di essa quando c'è un clic fuori dal cerchio?

12

consideri il 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; 

È possibile utilizzare questo codice per upate le bandiere finestra dopo è stato mostrato nella finestra a comparsa.

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. Funziona. Posso toccare entrambe le viste all'interno di 'popupWindow' e le visualizzazioni dell'attività. Solo 'updateViewLayout (contentView, p)', no 'contentView.getParent()' – Yeung

3

impostazione questi sull'istanza PopupWindow Prova:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

e

window.setTouchable(true);

Questo è solo un suggerimento ... Ho non testato. Fammi sapere se funziona.

[Nota: questo è per l'onTouch() per ricevere chiamate sugli eventi di tocco ..]

Problemi correlati