1. 程式人生 > >ScrollView巢狀WebView WebView自動滾動的問題

ScrollView巢狀WebView WebView自動滾動的問題

最近專案中有用到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