我是用btwebview来获取文本选择并处理的。问题是当我使用longPress与gestureDetector时,默认的选择也被启动了,如果我覆盖onTouchEvent并返回true,问题就解决了,但我不能点击webview上的任何按钮或高亮链接,所以我不能访问webview中插入的脚注或视频,并且shouldOverrideUrlLoading停止被调用。
public void init(Context context) {
System.out.println("BTWebview init");
this.context = context;
this.getSettings().setJavaScriptEnabled(true);
gestureScanner = new GestureDetector(this);
this.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
System.out.println("event "+event.toString() );
return gestureScanner.onTouchEvent(event);
}
});
setInitialScale(100);
addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.print("on touch event "+ event.toString());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
System.out.println("gesture listener onLongPress");
mSelection = true;
if(!this.isInSelectionMode()){
System.out.println("onLongClick in selection mode");
mSelection = true;
}
this.loadUrl("javascript:android.selection.longTouch();");
mScrolling = true;
System.out.println("onLongClick");
}
webview之所以对触摸停止响应,是因为该功能是在超类中实现的。onTouchEvent
.
所以,要想让它重新工作,你需要调用 super.onTouchEvent(event)
在你 onTouchEvent
. 很显然,只要一直打电话,就能让你回到起点。
为了实现你想做的事情,你需要调用的是 super.onTouchEvent
只有当你还没有检测到该事件是一个长按事件时,才会使用这个方法。最简单的方法是将指针ID从 "长按 "事件中存储起来。MotionEvent
传入 onLongPress
(你应该可以假设它是指针在索引 0 处,因为长按的定义是单个触摸事件)。
一旦你有了这个,你的onTouchEvent就可以像这样了
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getPointerId(0) != self.lastLongPressPointerId) {
return super.onTouchEvent(event);
}
return true;
}
你可能还需要注意与指针有关的ACTION_UP和ACTION_CANCEL事件,并在这之后停止寻找它,以防系统决定重新使用指针ID。