版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZuoZuoShengHen/article/details/85014274
最近项目中有用到WebView,然后底部又用需要展示原生的内容。于是就想到了用ScrollView嵌套WebView,
原来想的是WebView的高度固定,通过滑动WebView到临界值去交换滑动事件,但发现会有一些小问题。Ps: WebView未加载完全时能看到WebView底部的原生内容,而且滑动到WebView顶部获底部交换滑动事件时会有卡顿,没有联动的效果,影响用户体验。
于是乎只能换另一种方式:通过动态的获取WebView的内容设置WebView的高度:
javascript:MyApp.resize(document.body.getBoundingClientRect().height);
@JavascriptInterface
public void resize(final float height) {
mWebView.post(new Runnable() {
@Override
public void run() {
if (mWebView != null) {
ViewGroup.LayoutParams params = mWebView.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels;
params.height = (int) (height * getResources().getDisplayMetrics().density);
mWebView.setLayoutParams(params);
}
}
});
}
当然还需要监听onDraw方法去监听WebView的内容变化去改变WebView的高度:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (getContentHeight() != lastContentHeight) {
lastContentHeight = getContentHeight();
if (mOnContentChangeListener != null) {
mOnContentChangeListener.onContentChange();
}
}
}
mWebView.setOnContentChangeListener(new CustomWebView.OnContentChangeListener() {
@Override
public void onContentChange() {
if (mWebView != null) {
mWebView.loadUrl("javascript:MyApp.resize(document.body.getBoundingClientRect().height)");
}
}
});
滑动事件交给ScrollView控制。但此时遇到一个问题困扰了我好久:有时候加载WebView的时候WebView会自动滚动到某一区域而不是顶部。
原来的思路是监听WebView的加载进度然后到100%的时候设置滚动到顶部,发现还是有瑕疵,因为自动滚动是发生在加载完成之后。后来灵机一动,想到ViewPager+Fragment+RecyclerView的时候有时候RecyclerView会自动滚动,想到可能是WebView抢占了焦点而导致的自动滚动,于是就在WebView的父布局加了一行:
android:descendantFocusability="blocksDescendants"
发现解决了!神奇,哈哈!~
至于descendantFocusability的作用可以看我上一篇博文:https://blog.csdn.net/ZuoZuoShengHen/article/details/85009176