我有以下层次结构:Activity
- > PopupWindow
- > CustomView
我的PopupWindow
本身是一个正方形,但是透明,因此您可以看到活动位于后台。 CustomView
是PopupWindow中嵌入的圆圈。
到目前为止我所取得的成就是
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;
}
});
我必须做的其他事情才能将触摸事件一直委托给Activity?
答案 0 :(得分: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;
在显示弹出窗口后,您可以使用此代码更新窗口标志。
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);
答案 1 :(得分:3)
尝试在PopupWindow实例上设置这些:
window.setBackgroundDrawable(new BitmapDrawable());
window.setOutsideTouchable(true);
和
window.setTouchable(true);
这只是一个建议......我还没有测试过。 如果有效,请告诉我。
[注意:这是为了在触摸事件上调用onTouch()..]
答案 2 :(得分:0)
PopupWindow不是ViewGroup的子类甚至是View,这太糟糕了。然后你可以覆盖dispatchTouchEvent。您是否可以修改自定义视图以了解PopupWindow,并在圈外点击时调用dismiss()?