gpt4 book ai didi

android - 如何在内部 View 上接受 onSingleTapUp() 而在外部 View 上接受 onFling()?

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:02 24 4
gpt4 key购买 nike

我有一个覆盖整个屏幕的 View (比方说 ParentView),以及仅覆盖其中一部分的子内部 View ChildView。我想让 ChildView 响应 onSingleTapUp(),而 ParentView 响应 onFling()。我试图通过在 ChildView 上附加一个 SimpleOnGestureListener 和在 ParentView 上附加一个 SimpleOnGestureListener 来做到这一点。

要从 ChildView 接受 onSingleTapUp(),其监听器的 onDown() 必须返回 true。但是一旦我这样做,绑定(bind)到 ParentView 的监听器就不会再听到任何运动事件,因为它是由 ChildView 的监听器获取的。即使 ChildViewonFling() 返回 false,事件也不会流向 ParentView 的监听器。

如何让父 View 的监听器捕捉到滑动手势,而 subview 的监听器捕捉到点击手势?

我认为不需要任何源代码来解释这种情况,但这里有一段设置我的 ChildView 监听器的 fragment 。

ChildView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return singleTapGestureDetector.onTouchEvent(motionEvent);
}
});

一种解决方法是让 ParentViewChildView 的监听器都处理 onFling() 而只有 ChildView 的监听器句柄 onSingleTapUp(),但在那种情况下,fling 将无法在 ChildView 中发生(比如从子对象外部开始,然后在子对象内部结束 child ),我相信。

最佳答案

我不喜欢我的解决方案,但我找到了一种方法来做到这一点。希望其他人将来会发布更好的答案,或者至少我的解决方法对其他人有用。

正如我在问题中所描述的,问题在于手势监听器的工作方式。对于捕获 onSingleTapUp() 事件的 subview ,您在 onDown() 上返回 true。但是一旦您这样做了,即使您的 subview 的 onTouch() 声明它不再对该事件感兴趣,后续事件系列也不会转到父 View 。如果你在 child 的 onTouch() 中强制调用父的 onTouch(),当它的手势检测器返回 false 时,是的,父的 onFling() 将被调用,但第一个 MouseEvent 参数将为 NULL,因为它被 subview 的 onTouch() 使用。

我一定是遗漏了什么,因为这似乎是非常基本的手势检测场景。无论如何,我找不到合理的方式来做到这一点。

因此,我的解决方法是将 TouchListenerService 设为单例。

subview 和父 View 都有这一行:

view.setOnTouchListener(TouchListenerService.Instance());

TouchListenerService 是这样启动的:

public class TouchListenerService
extends GestureDetector.SimpleOnGestureListener
implements View.OnTouchListener {

// some code to implement singleton

public SingleTapUpHandler SingleTapUpHandler;
public FlingHandler FlingHandler;

private View _touchingView;

GestureDetector gestureDetector;

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (gestureDetector == null)
gestureDetector = new GestureDetector(_touchListenerService);

_touchingView = view;
boolean result = gestureDetector.onTouchEvent(motionEvent);
_touchingView = null;
return result;
}
// and some more code

由于是同一个事件处理器,父 View 成功捕获了onFling()事件,而 subview 可以设置SingleTapUpH​​andler来处理点击事件。

关于android - 如何在内部 View 上接受 onSingleTapUp() 而在外部 View 上接受 onFling()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com