首页 > 解决方案 > 通过在边缘外单击来调整窗口大小时如何拦截所有触摸事件

问题描述

我试图了解 android 上的以下拖动和调整大小行为,但无法追踪。我在多窗口自由形式模式下启动了以下窗口[下面的屏幕截图],如果我在边缘之外(4 个边中的任何一个)单击,窗口可以调整大小。我试图拦截整个手势(在窗口外触摸/单击)并拖动。

  1. 我尝试为从窗口获得的装饰视图设置一个触摸侦听器,并从中返回 true 以接收与此手势相关的所有进一步事件。

        getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
        private static final String TAG = "DVTouchListener";
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            Log.d(TAG,"onTouch "+motionEvent);
            return true;
        }
    });
    

    但这只会得到一个 ACTION_DOWN 紧随其后的是一个 ACTION_CANCEL(在按下指针并且甚至没有开始拖动时收到 ACTION_CANCEL)。

  2. 我尝试覆盖活动的 dispatchTouchEvent 并从那里返回 true 以接收手势的所有 MotionEvent,但是在那里也观察到相同的情况。ACTION_DOWN 后跟 ACTION_CANCEL。

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
       Log.d(TAG,"dispatchTouchEvent "+ev.toString());
       //        return super.dispatchTouchEvent(ev);
       return true;
    }
    

    我无法理解这种行为,因为我对触摸传播的理解是

如果 Activity.dispatchTouchEvent() 返回 true,那么它将消耗所有后续手势事件 (MOVE/UP)。而在返回 false 时,将永远不会再为后续事件调用它。

有人可以提供有关如何在手势中点击整组 MotionEvents 的任何提示,或者至少解释观察到的行为。这完全是因为我正在处理一个特定的用例,我需要将调整大小的能力限制在窗口的一侧。 在此处输入图像描述

标签: androidandroid-activityandroid-windowmanagerandroid-touch-event

解决方案


如果您返回 true,则意味着您想要解析所有事件,但顶级视图仍然可以自己获取所有事件,并且当它决定为子视图触发 ACTION_CANCEL 时,您知道不会从手势接收到更多事件。在您的情况下,如果您尝试从系统视图事件中侦听,它具有使用所有事件的所有优先级(因为它首先侦听它)。


推荐阅读