之前『Android Toolbar 显示 WebView Title』等文章中提到现在很多 App 都使用内嵌网页的方式来提高迭代效率,而『WeChat』便是其一,最大的体现就是在公众号文章中,不过其使用的不是原生的 WebView,而是定制的腾讯 X5 内核 TBS。

其中比较有用的是,在加载网页时,上方会有一个进度条用于展示当前网页的加载进度:

微信加载网页时的进度条

这是一个很好的交互控件,能够让用户知晓当前的加载状态,来作出对应的操作。

那么原生 WebView 能否加上一个进度条呢?当然可以。

首先需要在「drawable」文件夹下创建一个进度条 ProgressBar 的背景样式,这里我把它命名为「progress_bar.xml」:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="2dp" />
            <gradient
                android:angle="270"
                android:centerColor="#E3E3E3"
                android:endColor="#E6E6E6"
                android:startColor="#C8C8C8" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />
                <gradient
                    android:centerColor="#999999"
                    android:endColor="#999999"
                    android:startColor="#999999" />
            </shape>
        </clip>
    </item>
</layer-list>

在布局文件内加入 ProgressBar 控件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize" />
    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="3dp"
        android:progressDrawable="@drawable/progress_bar"
        android:visibility="gone"
        style="?android:attr/progressBarStyleHorizontal" />
    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

ProgressBar 控件导入了刚才的背景样式,并指定了其 style。

最后写出其显示逻辑:

ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
WebView webView = (WebView) findViewById(R.id.web_view);
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == 100) {
            progressBar.setVisibility(View.GONE);
        } else {
            progressBar.setVisibility(View.VISIBLE);
            progressBar.setProgress(newProgress);
        }
    }
});

WebChromeClientonProgressChanged() 方法会回调 WebView 的加载进度,我们在这里获取到进度值并设置到 ProgressBar 中去,并且在进度为 100% 也就是加载完成时消失,即可实现如同『WeChat』般加载网页的进度条效果了。