android - 通过在边缘外单击来调整窗口大小时如何拦截所有触摸事件
问题描述
我试图了解 android 上的以下拖动和调整大小行为,但无法追踪。我在多窗口自由形式模式下启动了以下窗口[下面的屏幕截图],如果我在边缘之外(4 个边中的任何一个)单击,窗口可以调整大小。我试图拦截整个手势(在窗口外触摸/单击)并拖动。
我尝试为从窗口获得的装饰视图设置一个触摸侦听器,并从中返回 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)。
我尝试覆盖活动的 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 的任何提示,或者至少解释观察到的行为。这完全是因为我正在处理一个特定的用例,我需要将调整大小的能力限制在窗口的一侧。
解决方案
如果您返回 true,则意味着您想要解析所有事件,但顶级视图仍然可以自己获取所有事件,并且当它决定为子视图触发 ACTION_CANCEL 时,您知道不会从手势接收到更多事件。在您的情况下,如果您尝试从系统视图事件中侦听,它具有使用所有事件的所有优先级(因为它首先侦听它)。
推荐阅读
- owl - 作为 unionOf 的类,但没有其他类不相交
- wordpress - 从另一台服务器重定向 URL
- amazon-ec2 - AWS EC2:sudo:apt-get:找不到命令错误
- excel - VBA 名称管理器数组
- php - 在顺序数据上,如何避免 foreach 中的相同数据?
- eclipse - 如何在每个议程组中都有一个流口水规则?
- swift - CVPixelBuffer – 如何在 60 fps 中捕获每第三帧?
- python - Python像字符串一样操作字节字符串或以某种方式解析
- c# - unity改变按钮子组件图片
- c# - ASP.NET Web API OData V4 服务返回 HTTP 404 ($top)