我有一个自定义视图,在我的活动中为其分配了以下OnTouchListener:
private OnTouchListener MyOnTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
System.out.println("onTouch called.");
System.out.println("x" + event.getX() + ", y: " + event.getY());
return true;
}
};
这会按预期在日志中注册和显示事件,直到用户将手指向上或向下移动超过几个像素。在此之后,在用户移除并重新应用他们的手指之前,不会将任何触摸事件传递给侦听器。但是,使用adb shell getevent
表示仍在生成事件。可以在http://pastebin.com/7EBM2X4V找到带注释的LogCat输出示例。
问题不在于手指超出视图范围。
有谁知道我为什么会有这种行为?
答案 0 :(得分:1)
事实证明,问题是视图包含在ScrollView中。删除ScrollView可以解决问题。
答案 1 :(得分:1)
这可能是旧的,但它仍会出现在搜索结果中。 可以通过执行以下操作来阻止ScrollView拦截触摸事件:
private OnTouchListener MyOnTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
//our touch handling began, request the scrollview not to interact
scrollView.requestDisallowInterceptTouchEvent(true);
System.out.println("Down");
System.out.println("x" + event.getX() + ", y: " + event.getY());
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
System.out.println("Move");
System.out.println("x" + event.getX() + ", y: " + event.getY());
}else if(event.getAction()==MotionEvent.ACTION_UP){
//re-enable it after we're done (finger goes up)
scrollView.requestDisallowInterceptTouchEvent(true);
System.out.println("up");
System.out.println("x" + event.getX() + ", y: " + event.getY());
}
return true;
}
};
答案 2 :(得分:0)
你必须在onTouch中指定事件,例如向下,向上或向上,你必须这样做。
private OnTouchListener MyOnTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
System.out.println("Down");
System.out.println("x" + event.getX() + ", y: " + event.getY());
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
System.out.println("Move");
System.out.println("x" + event.getX() + ", y: " + event.getY());
}else if(event.getAction()==MotionEvent.ACTION_UP){
System.out.println("up");
System.out.println("x" + event.getX() + ", y: " + event.getY());
}
return true;
}
};