自定义组件—LoadingProcessView
来源:互联网 发布:汽车快修店软件 编辑:程序博客网 时间:2024/06/06 05:22
注:该文章为(男人应似海)原创,如需转载请注明出处!
当我们使用WebView加载网页时,我们会希望在网页加载过程中有个进度提示,这样用户体验会更好些。实现这样的功能有两种方法:
1. 通过调用相应方法,使用系统自带的组件来完成。进度条颜色和位置固定不可修改。
效果图如下(顶部绿色为进度条)
2. 通过自定义组件,根据自己的需要或喜好来实现。进度条颜色和位置可以自由安排。
效果图如下(底部红色为进度条)
显然,我们更喜欢第二种方法。下面是两种方法的具体实现:
1.第一种实现方式:布局文件webview_progress_layout.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/web_body" android:background="#ffffffff"></WebView></RelativeLayout> 代码:package doudou.android.webview.progress; import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient; public class WebViewProgressActivity extends Activity { /** Called when the activity is first created. */ private WebView webView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.webview_progress_layout); webView=(WebView) findViewById(R.id.web_body); this.webView.setWebViewClient(new MyWebViewClient()); this.webView.setWebChromeClient(new MyWebChromeClient()); // 设置支持JavaScript WebSettings settings = this.webView.getSettings(); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setJavaScriptEnabled(true); settings.setAllowFileAccess(true); settings.setPluginsEnabled(true); settings.setSaveFormData(true); settings.setLoadsImagesAutomatically(true); // Enable zooming settings.setSupportZoom(true); settings.setBuiltInZoomControls(true); // 加载网页 this.webView.loadUrl("http://www.baidu.com"); } class MyWebViewClient extends WebViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // TODO Auto-generated method stub super.onReceivedError(view, errorCode, description, failingUrl); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 重写此方法表明点击网页里的链接还是在当前的WebView里打开而不跳到浏览器 view.loadUrl(url); return true; } } class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { WebViewProgressActivity.this.getWindow().setFeatureInt( Window.FEATURE_PROGRESS, newProgress * 100); super.onProgressChanged(view, newProgress); } }} 2.第二种方法这是一个自定义的显示加载进度的组件。package doudou.android.webview.progress;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.View; /****************************************************************** * 文 件 名:LoadingProcessView.java * 文件描述 : 显示加载时的进度条 * 作 者:wader * 创建时间:2011-8-23下午17:26:06 * 修改时间:2011-8-23下午17:26:06 ******************************************************************/public class LoadingProcessView extends View { /** * 用于绘制进度条 */ private final float STATRTX = 0.0f; private final float STATRTY = 0.0f; private final int PERCENT = 100; /** * 进度条的进度百分比 */ private int precent; /** * 加载状态 */ private boolean isShow; /** * 下载进度条颜色 */ private final int PROGRESS_COLOR = 0xFFB70C0C; /** * 进度条的背景颜色 */ private final int PROCESS_BACKGROUD = 0xFFBDBDBD; /** * 进度条的宽度 */ private int processWidth = 320; /** * 进度条的高度 */ private int processHeight = 20; /** * 画笔对象 */ private Paint paint; /** * 构造方法 * @param context UI窗口上下文 */ public LoadingProcessView(Context context) { super(context); } /** * 构造方法 * @param contextUI窗口上下文 * @param attrs 属性集 */ public LoadingProcessView(Context context, AttributeSet attrs) { super(context, attrs); } /** * 构造方法 * @param contextUI窗口上下文 * @param attrs属性集 * @param defStyle */ public LoadingProcessView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 绘图方法 * @param canvas画布 */ @Override protected void onDraw(Canvas canvas) { Log.e("LoadingProcessView", "onDraw=" + precent); super.onDraw(canvas); if (paint == null) { paint = new Paint(); // 设置绘制的进度条的颜色为红色 } paint.setColor(PROCESS_BACKGROUD); canvas.drawRect(STATRTX,STATRTY,(float)processWidth,processHeight,paint); paint.setColor(PROGRESS_COLOR); canvas.drawRect(STATRTX, STATRTY, (float) (precent * processWidth / PERCENT), processHeight, paint); } /** * 设置进度条大小 * @param processWidth宽度 * @param processHeight高度 */ public void setProgressSize(int processWidth, int processHeight) { this.processWidth = processWidth; this.processHeight = processHeight; } /** * 设置进度条的进度 * @param precent当前下载进度 * @param isShow是否显示加载状态 */ public void setProgress(int precent, boolean isShow) { this.precent = precent; this.isShow = isShow; } /** * 获取是否正在加载的状态 * @return 是否正在加载 */ public boolean getIsShow() { return isShow; }}布局文件webview_progress_layout.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:id="@+id/widget_progress" android:layout_width="fill_parent"android:layout_height="20dip" android:gravity="center"android:orientation="horizontal" android:background="#ffffffff" android:layout_alignParentBottom="true"></RelativeLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"android:id="@+id/web_body" android:background="#ffffffff" android:layout_above="@id/widget_progress"></RelativeLayout></RelativeLayout> 代码:package doudou.android.webview.progress; import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.Window;import android.view.ViewGroup.LayoutParams;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.FrameLayout;import android.widget.RelativeLayout; public class WebViewProgressActivity extends Activity { /** Called when the activity is first created. */ private Timer timer = new Timer(); /* * 显示WebView的布局 */ private RelativeLayout webContent; private WebView webView = null; /* * 显示加载进度条的布局和view */ private RelativeLayout processLayout = null; private LoadingProcessView lpv = null; /* * 进度条默认高度 */ private int processHeight = 20; private TimerTask progressTask = null; private int currentProgress = 0; private static int realProgress = 0; private static int increase = 5; private boolean isProgressVisible = false; private final int LOADFINISH = 0; private final int ISLOADING = 1; protected final int FINISH = 100; protected final static long REFRESHTIME = 350; private Handler processHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case ISLOADING: if (lpv != null) lpv.invalidate(); break; case LOADFINISH: if (processLayout != null) processLayout.setVisibility(View.GONE); break; } super.handleMessage(msg); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.webview_progress_layout); lpv = new LoadingProcessView(this); processLayout = (RelativeLayout) findViewById(R.id.widget_progress); processLayout.getLayoutParams().height = processHeight; // 将进度条添加到显示页面当中 processLayout.addView(lpv, 0, new FrameLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); webContent = (RelativeLayout) findViewById(R.id.web_body); this.webView = new WebView(this); webView.setLayoutParams(new FrameLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); this.webView.setWebViewClient(new MyWebViewClient()); this.webView.setWebChromeClient(new MyWebChromeClient()); // 设置支持JavaScript WebSettings settings = this.webView.getSettings(); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setJavaScriptEnabled(true); settings.setAllowFileAccess(true); settings.setPluginsEnabled(true); settings.setSaveFormData(true); settings.setLoadsImagesAutomatically(true); // Enable zooming settings.setSupportZoom(true); settings.setBuiltInZoomControls(true); // 加载网页 this.webView.loadUrl("http://www.google.com"); } class MyWebViewClient extends WebViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // TODO Auto-generated method stub super.onReceivedError(view, errorCode, description, failingUrl); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 重写此方法表明点击网页里的链接还是在当前的WebView里打开而不跳到浏览器 view.loadUrl(url); return true; } } class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress > 30) { processHandler.sendMessage(processHandler .obtainMessage(ISLOADING)); } if (progressTask == null) { progressTask = new TimerTask() { @Override public void run() { currentProgress += increase; if (currentProgress < realProgress && lpv != null) { System.out.println("currentProgress: " + currentProgress); lpv.setProgress(currentProgress, true); processHandler.sendMessage(processHandler .obtainMessage(ISLOADING)); } else { currentProgress -= increase; } } }; } if (!isProgressVisible) { isProgressVisible = true; if (processLayout != null) { processLayout.setVisibility(View.VISIBLE); } timer.schedule(progressTask, 20, REFRESHTIME); } realProgress = (newProgress + 300) >> 2; if (currentProgress >= 95 || realProgress == FINISH) { closeTimer(); if (newProgress == FINISH) { // 刷新进度条显示的进度,并且给界面发送消息通知界面刷新页面 if (lpv != null) { lpv.setProgress(newProgress, false); } processHandler.sendMessage(processHandler .obtainMessage(LOADFINISH)); } webContent.removeAllViews(); webContent.addView(webView); webView.requestFocus(); } super.onProgressChanged(view, newProgress); } } private void closeTimer() { if (progressTask != null) { progressTask.cancel(); } if (lpv != null) { lpv.setProgress(FINISH, false); } currentProgress = 0; isProgressVisible = false; progressTask = null; }} 由于代码不是很难,就不做过多解释了,相信大家都能看得懂。
0 0
- 自定义组件—LoadingProcessView
- 自定义组件—LoadingProcessView
- 自定义组件—MyButton
- 自定义组件—MyListView
- 自定义组件—MyDownLoadProgressDialog
- Android学习—自定义组件
- Android学习—自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- 自定义组件
- java 的socket
- iptables 实现主机防火墙(四表五链)
- linux系统下怎么安装.deb文件
- 微信小程序开发流程梳理
- 正则表达式 :(?s)(?i) ?: 表示的意思
- 自定义组件—LoadingProcessView
- Web前端面试指导(十):元素定位有哪些?
- 基于qualcomm平台的车载娱乐系统的开发
- 宏在C++中的替代解决方案
- CSS3 实现动画功能
- 未能加载文件或程序集“Antlr3.Runtime”或它的某一个依赖项。参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))
- 「微信小程序」有哪些冲击与机会?
- 关于Json转换JSONObject数据异常问题
- 自定义组件—MyDownLoadProgressDialog