Android:将触摸事件委托给底层视图

我有以下层次结构: Activity – > PopupWindow – > CustomView

我的PopupWindow本身是一个正方形,但透明,所以你可以看到坐在后台的活动。 CustomView是embedded在PopupWindow中的一个圆。 替代文字

我迄今取得的成绩是

  1. 用户点击绿色圆圈,我调用“一些东西”
  2. 用户单击PopupWindow外部,触摸事件被分派到活动。

现在缺less的部分是派发任何触发事件,发生在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; } }); 

还有什么我必须做的委托触摸事件一直到活动?

Solutions Collecting From Web of "Android:将触摸事件委托给底层视图"

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

显示popup窗口 ,您可以使用此代码更新窗口标志。

 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); 

尝试在PopupWindow实例上设置这些:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

window.setTouchable(true);

这只是一个build议…我没有testing过。 让我知道如果它的作品。

[注意:这是onTouch()在触摸事件中被调用。]

PopupWindow不是ViewGroup甚至View的子类。 然后你可以重载dispatchTouchEvent。 你可以修改你的自定义视图来了解PopupWindow,并在圆外点击时调用dismiss()。