2010-09-30 3 views
21

Ich habe die folgende Hierarchie: Activity ->PopupWindow ->CustomViewAndroid: delegieren Berührungsereignis zu underlaying Ansicht

My die PopupWindow selbst ist ein Quadrat, aber transparent, so dass man die Aktivität sitzt im Hintergrund zu sehen. Der CustomView ist ein in das PopupWindow eingebetteter Kreis. alt text

Was ich bisher erreicht habe, ist

  1. Benutzer klickt auf grünen Kreis und rufe ich „ein paar Sachen“
  2. Nutzer klickt außerhalb der PopupWindow und das Touch-Ereignis wird auf die Aktivität ausgelöst.

Der fehlende Teil ist jetzt, jedes Berührungsereignis zu versenden, die innerhalb der PopupWindow aber außerhalb des CustomView (Kreises) auf die Aktivität geschieht.

Ich weiß bereits, wie man spürt, wenn die Berührung außerhalb meines Kreises ist. Ich habe gerade Probleme, es an die Aktivität zu delegieren.

In meinem CustomView Ich habe nach dem in onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

In meinem PopupWindow ich bereits Setup die folgenden, aber es wird nie genannt:

popup.setTouchInterceptor(new OnTouchListener() { 

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

ich sonst noch etwas tun müssen, um zu delegieren das Berührungsereignis bis hin zur Aktivität?

+3

Wie haben Sie dieses Modell erstellt?es ist ziemlich glatt – browep

+1

Wie hast du es geschafft, die Klickereignisse in die Ansichten unter dem PopUpWindow zu schicken? – Mannaz

+1

Moups wurden von Balsamic Mockups gemacht http://balsamiq.com/products/mockups/ –

Antwort

0

Es ist schade, dass das PopupWindow keine Unterklasse von ViewGroup oder View ist. Dann könnten Sie dispatchTouchEvent überschreiben. Können Sie Ihre benutzerdefinierte Ansicht ändern, um etwas über das PopupWindow zu erfahren, und call() aufrufen, wenn ein Klick außerhalb des Kreises erfolgt?

12

Betrachten Sie den 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; 

Sie diesen Code verwenden können, um die Fensterfahnen nach die Popup-Fenster angezeigt wurden upate.

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. Es klappt. Ich kann beide Ansichten in 'popupWindow' und die Ansichten von Aktivitäten berühren. Nur 'updateViewLayout (contentView, p)', kein 'contentView.getParent()' – Yeung

3

Versuchen Sie diese auf Ihrem PopupWindow Instanz Einstellung:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

und

window.setTouchable(true);

Dies ist nur ein Vorschlag ... Ich habe nicht getestet. Lassen Sie mich wissen, wenn es funktioniert.

[Hinweis: Dies ist für die onTouch() auf Touch-Ereignisse aufgerufen werden ..]

Verwandte Themen