Android:将触摸事件委托给基础视图

时间:2010-09-30 16:50:23

标签: android events touch

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

我的PopupWindow本身是一个正方形,但是透明,因此您可以看到活动位于后台。 CustomView是PopupWindow中嵌入的圆圈。 alt text

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

  1. 用户点击绿色圆圈,我调用“一些东西”
  2. 用户在PopupWindow之外点击,触摸事件将被分派到活动。
  3. 现在缺少的部分是将PopupWindow内但CustomView(圈子)之外发生的任何触摸事件发送到活动。

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

    CustomViewonTouch

    中有以下内容
    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?

3 个答案:

答案 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()?