我试图了解以下在 android 上的拖动和调整大小行为,但无法追踪。我在多窗口自由形式模式 [下面的屏幕截图] 中启动了以下窗口,如果我在边缘外(4 个边中的任何一个)单击,可以调整窗口大小。 我试图拦截整个手势(在窗口外触摸/单击)并拖动。
我已经尝试为获得的 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,甚至还没有开始拖动)。
我尝试覆盖 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 集的任何提示,或者至少解释观察到的行为。 这都是因为我正在处理一个特定的用例,我需要将调整大小的能力限制在窗口的一侧。
最佳答案
如果您返回 true 则意味着您想要解析所有事件,但顶层 View 仍然可以为自己获取所有事件,并且当它决定为 subview 触发 ACTION_CANCEL 时知道不会从该手势接收到进一步的事件.在您的情况下,如果您尝试从系统 View 事件中监听,它会优先使用所有事件(因为它首先监听)。
关于android - 如何通过在边缘外单击来调整窗口大小时拦截所有触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51429372/