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

标签 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. 我尝试覆盖 Activity 的 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;
    }
    

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

if Activity.dispatchTouchEvent() returns true then it’ll consume all the subsequent gesture events (MOVE/UP). Whereas on returning false it’ll never be called again for subsequent events.

有人可以提供有关如何在手势中点击整个 MotionEvents 集的任何提示,或者至少解释观察到的行为。 这都是因为我正在处理一个特定的用例,我需要将调整大小的能力限制在窗口的一侧。 enter image description here

最佳答案

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

关于android - 如何通过在边缘外单击来调整窗口大小时拦截所有触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51429372/

相关文章:

android - 如何将 Activity 的快捷方式放入启动器?

Android 窗口管理器布局膨胀器没有膨胀全屏布局

android - 无法删除 windowManager.addView() 附加的 View

android - 如何显示具有左/右/下边距的 BottomSheetDialogFragment?

java - 如何使用共享首选项存储和检索 recyclerview 数据

android - 链式启动多项 Activity

android - android中的圆形布局

Android webview 适合所有内容到屏幕

android - 使用 RxJava/RxAndroid 的 Retrofit2 尾递归

Android appcompat 操作栏菜单项 showAsAction 不起作用