防止父级仅针对某些视图获取触摸事件?



我里面有一个ScrollView和线性布局。在线性布局中,我有多个视图。多个视图之一(比如说 DrawView(用于绘制内容,因此我必须覆盖该方法onTouchEvent并绘制内容。目前,当我在DrawView上拖动或移动时,ScrollView还处理导致整个视图移动的触摸。我想要的是当我触摸DrawView时,滚动视图不应该移动。我在这里浏览了其中一些答案

如何在子视图和父视图组触摸事件之间切换

但是我没有找到任何可以添加DrawView的东西,以防止ScrollView上下移动。请注意,DrawView不会扩展ViewGroup所以我无权访问requestDisallowInterceptTouchEvent

你可以从DrawViewonTouchEvent中获取ScrollView

ScrollView scrollView = (ScrollView) getParent();

然后,您可以在scrollView上调用requestDisallowInterceptTouchEvent,以防止它在触摸DrawView时滚动。

scrollView.requestDisallowInterceptTouchEvent(true);

您可以在 DrawView 获得触摸事件时阻止滚动视图。为此,您需要创建自定义 ScrollView 调用,如下所示[原始代码片段]

public class MyScrollView extends ScrollView {
private boolean enableScrolling = true;
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (scrollingEnabled()) {
return super.onInterceptTouchEvent(ev);
} else {
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (scrollingEnabled()) {
return super.onTouchEvent(ev);
} else {
return false;
}
}
private boolean scrollingEnabled(){
return enableScrolling;
}
public void setScrolling(boolean enableScrolling) {
this.enableScrolling = enableScrolling;
}
}

您可以根据需要致电scrollView.setScrolling(true/false)

所以我最终在onTouchEvent方法的DrawView中这样做

getParent().requestDisallowInterceptTouchEvent(true);,它奏效了!

最新更新