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

znq*_*znq 21 events android touch

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

PopupWindow自己是一个方形,但透明,所以你可以看到活动坐在后台.这CustomView是一个嵌入PopupWindow内部的圆圈. 替代文字

到目前为止我取得的成就是

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

现在缺少的部分是将PopupWindowCustomView(圆圈)内部发生的任何触摸事件发送到活动.

我已经知道如何感觉触摸是在我的圈子之外.我只是将它委托给Activity时遇到了问题.

在我,CustomView我有以下内容onTouch

if (radiusTouch > maxRadius) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

在我的PopupWindow我已经设置了以下,但它永远不会被调用:

popup.setTouchInterceptor(new OnTouchListener() {

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

还有什么我需要做的事情来将触摸事件一直委托给Activity?

ale*_*2k8 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;
Run Code Online (Sandbox Code Playgroud)

在弹出窗口显示,您可以使用此代码更新窗口标志.

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);
Run Code Online (Sandbox Code Playgroud)


Vag*_*ant 0

遗憾的是 PopupWindow 不是 ViewGroup 甚至 View 的子类。然后你可以重写dispatchTouchEvent。您可以修改您的自定义视图以了解 PopupWindow 并在点击圆外时对其调用 Dismiss() 吗?