如何解决覆盖与ScrollView竞争的onTouchEvent
| 从简单的概述中,我有一个自定义视图,其中包含一些位图,用户可以拖动这些位图并调整其大小。 我这样做的方法是相当标准的,因为我在CustomView中覆盖onTouchEvent并检查用户是否在图像中进行触摸等。 当我要将这个CustomView放置在ScrollView中时,就会出现我的问题。这可行,但是ScrollView和CustomView似乎在争夺MotionEvents,即当我尝试拖动图像时,它要么移动缓慢,要么视图滚动。 我在想可能必须扩展ScrollView,以便可以重写onInterceptTouchEvent并让它知道用户是否在图像范围内,以免尝试滚动。但是,由于ScrollView在层次结构中处于较高的位置,我如何访问CustomView的当前状态? 有没有更好的办法?解决方法
通常,在此类情况下,Android使用长按来开始拖动,因为它有助于消除用户打算拖动项目时与滚动项目容器时的歧义。但是,如果在用户开始拖动项目时信号清晰,请在知道用户开始拖动时尝试从自定义视图中选择“ 0”。 (有关此方法的文档,请单击此处。)这将防止ScrollView拦截触摸事件,直到当前手势结束为止。
, 找到的所有解决方案都没有“开箱即用”的功能,可能是因为我的自定义视图扩展了View,而不是ViewGroup,因此我无法实现
onInterceptTouchEvent
。
也叫“ 0”是抛出NPE或什么都不做。
最后,这就是我解决问题的方式:
在您的自定义onTouchEvent
内部调用requestDisallow...
时,视图将处理该事件。例如:
@Override
public boolean onTouchEvent(MotionEvent event) {
Point pt = new Point( (int)event.getX(),(int)event.getY() );
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (/*this is an interesting event my View will handle*/) {
// here is the fix! now without NPE
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true);
}
clicked_on_image = true;
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (clicked_on_image) {
//do stuff,drag the image or whatever
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
clicked_on_image = false;
}
return true;
}
现在,我的自定义视图运行良好,可以处理一些事件,并让scrollView捕获我们不关心的事件。在此处找到了解决方案:http://android-devblog.blogspot.com.es/2011/01/scrolling-inside-scrollview.html
希望能帮助到你。
, 有一个名为MotionEvent.ACTION_CANCEL的Android事件(值= 3)。我要做的就是重写自定义控件的onTouchEvent方法并捕获此值。如果我检测到这种情况,那么我会做出相应反应。
这是一些代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
if(isTouchable) {
int maskedAction = event.getActionMasked();
if (maskedAction == MotionEvent.ACTION_DOWN) {
this.setTextColor(resources.getColor(R.color.octane_orange));
initialClick = event.getX();
} else if (maskedAction == MotionEvent.ACTION_UP) {
this.setTextColor(defaultTextColor);
endingClick = event.getX();
checkIfSwipeOrClick(initialClick,endingClick,range);
} else if(maskedAction == MotionEvent.ACTION_CANCEL)
this.setTextColor(defaultTextColor);
}
return true;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。