Android自定义WebView头部进度加载效果如何实现?
- 行业动态
- 2025-03-04
- 2
自定义WebView头部进度加载效果
在Android开发中,为了提升用户体验,特别是在网络加载不畅时,一个动态的加载进度条可以让用户感知到网页加载过程,而不是等待页面空白,下面将详细介绍如何实现自定义WebView头部的进度加载效果。
一、实现思路
1、自定义进度条组件:创建一个名为WebViewProgressBar
的子类,继承自View
,在这个类中设置进度条的高度为5dp,并定义一个Paint
对象用于绘制进度,进度默认值设为1,表示加载开始。
2、颜色渐变:使用一个颜色数组colors[]
,这里包含了两种颜色(绿色和未指定的颜色),用于创建进度条的渐变效果,在onDraw()
方法中,根据当前的进度比例填充不同颜色的区域。
3、进度更新与显示:当WebView开始加载时,隐藏进度条并将其初始值设置为100%,这样可以立即显示加载开始,当进度变化时,实时更新progress
变量,然后在onDraw()
中相应地绘制新的进度条位置,当进度达到100%后,延迟0.2秒再隐藏进度条,以提供更好的视觉反馈。
4、网络权限:别忘了在AndroidManifest.xml中添加网络访问权限<uses-permission android:name="android.permission.INTERNET" />
,这是使用WebView加载网页所必需的。
二、代码实现
1. WebViewProgressBar.java
package com.losileeya.materialprogresswebview.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class WebViewProgressBar extends View { private int progress = 1;//进度默认为1 private final static int HEIGHT = 5;//进度条高度为5 private Paint paint;//进度条的画笔 // 渐变颜色数组 private final static int colors[] = new int[]{Color.GREEN, Color.parseColor("#8AC14A"), Color.parseColor("#35B056")}; //int类型颜色值格式:0x+透明值+颜色的rgb值 public WebViewProgressBar(Context context) { this (context, null); } public WebViewProgressBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public WebViewProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(context); } private void initPaint(Context context) { paint = new Paint(Paint.DITHER_FLAG); paint.setStyle(Paint.Style.STROKE);// 填充方式为描边 paint.setStrokeWidth(HEIGHT);//设置画笔的宽度 paint.setAntiAlias(true);// 抗锯齿 paint.setDither(true);// 使用抖动效果 paint.setColor(context.getResources().getColor(R.color.primary_light));//画笔设置颜色 } / 设置进度 @param progress 进度值 / public void setProgress(int progress){ this.progress = progress; invalidate();//刷新画笔 } @Override protected void onDraw(Canvas canvas) { canvas.drawRect(0, 0, getWidth() progress / 100, HEIGHT, paint);//画矩形从(0.0)开始到(progress,height)的区域 } }
2. ProgressWebView.java
package com.losileeya.materialprogresswebview.widget; import android.content.Context; import android.graphics.Bitmap; import android.os.Handler; import android.util.AttributeSet; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class ProgressWebView extends WebView { private WebViewProgressBar progressBar;//进度条 private Context context; public ProgressWebView(Context context) { this(context, null); } public ProgressWebView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressWebView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; init(); } private void init() { progressBar = new WebViewProgressBar(context); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, dp2px(context, 4)); progressBar.setLayoutParams(layoutParams); progressBar.setColor(Color.BLUE); progressBar.setProgress(10); addView(progressBar); initWebSettings(); setWebChromeClient(new MyWebChromeClient()); setWebViewClient(new MyWebViewClient()); } private class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { new Handler().postDelayed(new Runnable() { @Override public void run() { progressBar.setVisibility(GONE); } }, 200); } else { if (progressBar.getVisibility() == GONE) progressBar.setVisibility(VISIBLE); progressBar.setProgress(newProgress); } super.onProgressChanged(view, newProgress); } } }
三、布局文件(res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.losileeya.materialprogresswebview.widget.ProgressWebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
四、相关问题与解答
1、问题:为什么需要在AndroidManifest.xml中添加网络访问权限?
答:需要在AndroidManifest.xml中添加网络访问权限是因为WebView需要通过网络加载网页内容,没有这个权限,应用将无法访问互联网,从而导致WebView无法正常加载网页,这是使用WebView加载网页所必需的权限声明。
2、问题:如何调整进度条的颜色和高度?
答:可以通过修改WebViewProgressBar
类中的colors
数组来调整进度条的颜色,通过修改HEIGHT
常量来调整进度条的高度,可以将colors
数组中的颜色值替换为其他颜色值,或者将HEIGHT
的值改为其他像素值,如10dp或20dp等。