gpt4 book ai didi

同时检测父 View 和 subview 的 Android-Touch 事件

转载 作者:可可西里 更新时间:2023-10-31 22:03:34 27 4
gpt4 key购买 nike

目前以下是我的应用程序的布局:

       LinearLayout
----Button
----ScrollView
----RelativeLayout
----EditText

我在所有这些上创建了一个透明的 LinearLayout,实现了 OnTouchListener 并在 OnTouch() 内部返回了 false。因此,所有控件都移动到子控件下方。但是在 LinearLayout 上,我无法处理 ACTION_MOVE 操作,因为此布局不使用 MotionEvent 对象。有什么方法可以检测父 View 和 subview 中的所有触摸事件吗?

最佳答案

根据我的经验,dispatchTouchEvent() 方法不应该被覆盖,因为它有点难以控制。我的建议是 onInterceptTouchEvent() 方法。 Android 不支持覆盖此选项。您可以通过创建自己的 View 来劫持它,这是从 RelativeLayout 扩展的 fragment :

public class InterceptTouchRelativeLayout extends RelativeLayout{

public interface OnInterceptTouchListener{
boolean onInterceptTouch(MotionEvent ev);
}

private OnInterceptTouchListener onInterceptTouchListener;

public InterceptTouchRelativeLayout(Context context) {
super(context);
}

public InterceptTouchRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public InterceptTouchRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return onInterceptTouchListener.onInterceptTouch(ev);
}

public void setOnInterceptTouchListener(OnInterceptTouchListener onInterceptTouchListener) {
this.onInterceptTouchListener = onInterceptTouchListener;
}

照常使用,

myView.setOnInterceptTouchListener(new InterceptTouchRelativeLayout.OnInterceptTouchListener() {
@Override
public boolean onInterceptTouch(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
// Parent didn't steal this touch event if return false this case.
return false;

case MotionEvent.ACTION_MOVE:
// Parent didn't steal this touch event if return false this case.
return false;

case MotionEvent.ACTION_UP:
// Parent didn't steal this touch event if return false this case. However, please notice, it's too late for the parent to steal this touch event at this time, it won't work anymore.
return true;
}

return false;
}
});

无论如何,我的建议是多研究那个 View / View 组控制触摸事件的流程。这是对 onInterceptTouchEvent() 如何为您的目的工作的解释:

  • 当在其子级所在的位置触摸父级时,将调用onInterceptTouchEvent(),如果我们在 ACTION_DOWN 返回 false,将认为 父级没有窃取此触摸事件,并检查其子项是否已实现 onTouch()。因此,只要 child 不调用requestDisallowInterceptTouchEvent(true), parent 仍然可以在onInterceptTouchEvent()中处理这个触摸事件, child 也可以处理相同的触摸事件在它自己的 onTouch() 事件中。然而,有时你需要考虑处理 parent 的onTouch()事件,以防没有 child 处理触摸事件, parent 可以处理。

关于同时检测父 View 和 subview 的 Android-Touch 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000958/

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