通过在边缘外部单击来调整窗口大小时如何拦截所有触摸事件

时间:2018-07-19 18:13:53

标签: android android-activity android-windowmanager android-touch-event

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

  1. 我尝试将触摸监听器设置为获得的decorview 从窗口返回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以接收手势的所有MotionEvents,但是在那里也观察到相同的情况。 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时,以后再也不会调用它了。

有人可以提供有关如何在手势中轻击整套MotionEvent的任何提示,或至少说明所观察到的行为的方法。 这就是全部,因为我正在处理一个特定的用例,在该用例中,我需要将调整大小的功能限制在窗口的一侧。 enter image description here

1 个答案:

答案 0 :(得分:1)

如果返回true,则表示您想解析所有事件,但顶层View仍可以自己捕获所有事件,并且当它决定为子视图触发ACTION_CANCEL时,该手势将不再接收任何事件。在您的情况下,如果尝试从系统视图事件监听,则优先使用所有事件(因为它首先监听)。