需求:很多时候,我们阅读类的app都会帮助用户存储上一次的阅读位置,方便用户进入到下一次的阅读位置。那如果我们开发者使用的是WebView时,是否可以记住阅读位置呢?
首先,我们废话不多说, 开始上代码。
/**
* 自定义的webview,用于监听滑动的位置
*/
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public MyWebView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//clampedX,clampedY用于判断是否发生了onOverScrolled
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
//设置监听,如果没有滑动到底部,则记录下当前的位置,如果滑动完毕,则返回true
if (onOveredScroll != null) {
onOveredScroll.onOvered(scrollY);
}
}
//自定义一个滚动完毕的监听接口
onOveredScroll onOveredScroll = null;
public interface onOveredScroll {
void onOvered(int scrollY);
}
public void setOnOveredScroll(MyWebView.onOveredScroll onOveredScroll) {
this.onOveredScroll = onOveredScroll;
}
}
通过查阅webview的源代码,我们发现。在
onOverScrolled这个方法中,会传入scrollX和scrollY 这两个参数,他们分别代表当前WebView 滑动时的坐标。 亲们,是不是突然恍然大悟了? 下面我们就可以通过一个接口,在Activity中实施监听Webview的滑动位置了!
//设置滚动位置监听
int curPos =-1;
mWebView.setOnOveredScroll(new MyWebView.onOveredScroll() {
@Override
public void onOvered(int scrollY) {
curPos = scrollY;
}
});
这时候,我们可以保存scrollY 到数据库或者sharedpreferences中, 读取位置的坐标后。 再用mWebView.scrollto 方法自动跳转到用户上次查阅的地方啦!