通常我们在写WebView时,会遇到需要自定义进度条样式位置的问题,下面我们参照系统的实现方案写一个例子
注:实际效果可以参看微信的web页面顶部进度条,当然颜色就别参看了
本质就是通过对Web控件addView添加Progress对象,使用WebChromeClient对WebView 页面进度进行监听
自定义的DrawableId,我们参照系统的实现的方法写一个自己的
[代码]xml代码:
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"> // 这个属性是指定progress的背景
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#00000000"
android:centerColor="#00000000"
android:centerY="0.75"
android:endColor="#00000000"
android:angle="270"
/>
</shape>
</item>
<item android:id="@android:id/progress"> // 这个属性是指定progress的进度
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#f69988"
android:centerColor="#e84e40"
android:centerY="0.75"
android:endColor="#dd191d"
android:angle="0"
/>
</shape>
</clip>
</item>
</layer-list>
|
实际还有一个secondProgress的属性,这个也随意设置,一般用不到
看一下addView添加Progress的实现:
[代码]java代码:
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | Drawable drawable = context.getResources().getDrawable(DrawableId);// 该资源以系统原码为参照搞一个自己想要的角度颜色背景
if (progressbar == null)
progressbar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);// 这里必须要使用系统的attr属性才能正常实例化出来
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams
(ViewGroup.LayoutParams.MATCH_PARENT, height);// 用相对布局更方便指挥这个progress;代码实现的height都为pix级别
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);// 相对于添加它的父类View,顶部
if (progressbar != null) {
progressbar.setLayoutParams(layoutParams);
if (drawable != null) {
progressbar.setProgressDrawable(drawable);
progressbar.setIndeterminate(false);// 此值表明进度是不明确的,我们实际在网页打开过程中并不知道具体进度是多少
}
}
if (<span style="font-size: 9pt; line-height: 25.2px;">viewGroupParent</span><span style="font-size: 9pt; line-height: 1.8em;"> == null)</span><br> return;
viewGroupParent.addView(progressbar);
if (webView == null)
return;
webView.setWebChromeClient(new WebChromeClient());// 给webview提供一个可以监听进度的对象,系统内的WebChromeClient 已经有了这个进度通知方法
|
下面看我们实现的WebChromeClient
[代码]java代码:
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class WebChromeClient extends android.webkit.WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress >= Max) {// 临界值是用来改变显示状态
if (progressbar != null)
progressbar.setVisibility(View.GONE);
} else {
final int progress = newProgress;// 实际能避免新增对象就避免
if (progressbar != null && progressbar.getVisibility() != View.VISIBLE)
progressbar.setVisibility(View.VISIBLE);
if (weakHandler == null)
return;
handler.post(new Runnable() {//handler 的实际意图就是为了避免在非主线程改变UI,如果一定要在子线程改变Ui,记得给子线程一个Looper
@Override
public void run() {
if (progressbar != null) {
progressbar.setProgress(progress);
progressbar.incrementProgressBy(increase);// 平缓增加
}
}
});
}
super.onProgressChanged(view, newProgress);
}
}
|
完活
原文链接:http://www.apkbus.com/blog-35555-60412.html