webview 实现滑动前进后退功能

时间:2024-01-04 08:59:02

实现该功能大家一定会想到在OnTouchListener里实现

webview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
int endX = (int) event.getX();
if(endX>startX && webview.canGoBack() && endX-startX>scrollSize){
webview.goBack();
}else if(endX<startX &&webview.canGoForward() && startX-endX>scrollSize){
webview.goForward();
}
break;
default:
break;
}
return false;
}
});

这里要注意的是,返回值要为false,将此事件继续向下传递.否则会引起 超链接不起作用的问题.

将onTouch()事件中的返回值改为false之后,有时候仍然还是不会触发onTouch()事件,那是因为加了缩放功能,使得Touch事件会失效。由于webview的缩放同样会响应onTouch事件的,所以会覆盖掉我们自己设置的onTouhc监听,引起了事件的冲突。

解决冲突的方法如下:

将touch事件写到dispatchTouchEvent中

@Override
public boolean dispatchTouchEvent(MotionEvent ev) { webview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
int endX = (int) event.getX();
if(endX>startX && webview.canGoBack() && endX-startX>scrollSize){
webview.goBack();
}else if(endX<startX &&webview.canGoForward() && startX-endX>scrollSize){
webview.goForward();
}
break;
default:
break;
}
return false;
}
});
return super.dispatchTouchEvent(ev);
}