目前以下是我的应用程序的布局:
LinearLayout
----Button
----ScrollView
----RelativeLayout
----EditText
我在所有这些之上创建了一个透明的 LinearLayout,实现了 OnTouchListener 并在 OnTouch() 内部,返回 false。因此,所有控件都移动到子级下方。但是在 LinearLayout 上,我无法处理 ACTION_MOVE 操作,因为此布局不消耗 MotionEvent 对象。有什么方法可以检测父视图和子视图中的所有触摸事件吗?
在我的经验中,dispatchTouchEvent()
方法不应该被重写,因为它很难控制。我的建议是onInterceptTouchEvent()
方法。 Android 不支持覆盖此选项。您可以通过创建自己的视图来劫持它,下面是从relativelayout扩展的代码片段:
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;
}
});
无论如何,我的建议是更多地研究视图/视图组控制触摸事件的流程。这是一个解释onInterceptTouchEvent()
会为您的目的而工作:
- 当触摸父级的子级所在位置时,
onInterceptTouchEvent()
将会被调用,如果我们在 ACTION_DOWN 处返回 false,则会认为父级尚未窃取此触摸事件,并检查其子级是否已实现onTouch()
。这样,只要孩子不叫requestDisallowInterceptTouchEvent(true)
,父母仍然可以处理这个触摸事件onInterceptTouchEvent()
并且孩子可以自己处理相同的触摸事件onTouch()
event。但是,有时您需要考虑处理onTouch()
父母的事件,如果没有孩子处理触摸事件,那么父母可以处理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)