2010-09-30 84 views
21

我有以下層次:Activity - >PopupWindow - >CustomView安卓:委託觸摸事件墊層視圖

我的PopupWindow本身就是一個正方形,而是透明的,所以你可以看到活動坐在後臺。 CustomView是嵌入在PopupWindow中的一個圓。 alt text

到目前爲止,我已經實現了什麼是綠色圓圈

  1. 用戶點擊和我援引「一些東西」
  2. 用戶點擊PopupWindow的外部和觸摸事件被分派到活動。

現在缺少的部分是調度發生在PopupWindow內但在CustomView(圓圈)之外的任何觸摸事件。

我已經知道如何感知觸摸何時在我的圈子之外。我只是有問題委託給活動。

在我CustomView我已經中onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

下在我PopupWindow我已經設置以下,但這樣做的從來不叫:

popup.setTouchInterceptor(new OnTouchListener() { 

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

別的我必須做的委託觸摸事件一直到活動?

+3

您是如何創建該模型的?它很漂亮 – browep 2011-11-15 01:27:45

+1

你是如何設法將點擊事件分派到PopUpWindow下面的視圖的? – Mannaz 2012-04-03 14:01:54

+1

Mocups已通過香醋模型完成http://balsamiq.com/products/mockups/ – 2014-01-15 14:06:49

回答

0

這太糟糕了,PopupWindow不是ViewGroup甚至View的子類。然後你可以重寫dispatchTouchEvent。你可以修改你的自定義視圖以瞭解PopupWindow,並在圓外點擊時調用dismiss()。

12

考慮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; 

您可以使用此代碼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

好的。有用。我可以在'popupWindow'和活動的視圖中觸及這兩個視圖。只需要'updateViewLayout(contentView,p)',不需要'contentView.getParent()' – Yeung 2013-03-19 05:23:00

3

嘗試在你的PopupWindow實例設置這些:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

window.setTouchable(true);

這僅僅是一個建議,我還沒有測試過它。 讓我知道它是否有效。

[注意:這是用於在觸摸事件上調用onTouch()。]