2010-09-30 37 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()。]