美文网首页Android干货android实用技术Android知识
Android 编写一个带进度条的Webview

Android 编写一个带进度条的Webview

作者: 饱醉豚我去年买了个表 | 来源:发表于2017-04-01 16:32 被阅读3838次

    今天是4月1号,大家愚人节快乐~清明节放假咯!清明节放假咯!清明节放假咯!重要的事情说三遍,祝大家玩得愉快!

    言归正传,用Webview加载一个网页时,如果加载时间长,界面会一直空白,体验不太好,所以加个进度条更好看一下,主流APP也都有进度条效果,先上效果图:


    progressBar.png

    完整代码地址已上传Github:带进度条的Webview

    之前看到一篇博文:Android WebView顶部进度条,作者直接用的ProgressBar方式实现的,但不知是代码有问题,还是我的使用姿势不对,一进来加载进度条就直接到100%了,有知道问题出在哪里的还请不吝赐教,在下面评论里指出来,感谢!

    回到正题,看这个效果也不难,就想直接用自定义View写一个出来,ProgressView .java用来实现进度条效果:

    public class ProgressView extends View {
        private Paint mPaint;
        private int mWidth, mHeight;
        private int progress;//加载进度
    
        public ProgressView(Context context) {
            this(context, null);
        }
    
        public ProgressView(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public ProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            //初始化画笔
            mPaint = new Paint();
            mPaint.setDither(true);
            mPaint.setAntiAlias(true);
            mPaint.setStrokeWidth(10);
            mPaint.setColor(Color.RED);
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int ow, int oh) {
            mWidth = w;
            mHeight = h;
            super.onSizeChanged(w, h, ow, oh);
        }
    
    
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawRect(0, 0, mWidth * progress / 100, mHeight, mPaint);
            super.onDraw(canvas);
        }
    
        /**
         * 设置新进度 重新绘制
         *
         * @param newProgress 新进度
         */
        public void setProgress(int newProgress) {
            this.progress = newProgress;
            invalidate();
        }
    
        /**
         * 设置进度条颜色
         *
         * @param color 色值
         */
        public void setColor(int color) {
            mPaint.setColor(color);
        }
    }
    

    然后在Webview中使用,Webview的父类是 AbsoluteLayout,所以可以通过addView()的方式将我们自定义的进度条加进去,代码如下:

    public class Html5Webview extends WebView {
        private ProgressView progressView;//进度条
        private Context context;
    
        public Html5Webview(Context context) {
            this(context, null);
        }
    
        public Html5Webview(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public Html5Webview(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.context = context;
            init();
        }
    
        private void init() {
            //初始化进度条
            progressView = new ProgressView(context);
            progressView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp2px(context, 4)));
            progressView.setColor(Color.BLUE);
            progressView.setProgress(10);
            //把进度条加到Webview中
            addView(progressView);
            //初始化设置
            initWebSettings();
            setWebChromeClient(new MyWebCromeClient());
            setWebViewClient(new MyWebviewClient());
        }
    
        private class MyWebCromeClient extends WebChromeClient {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100) {
                    //加载完毕进度条消失
                    progressView.setVisibility(View.GONE);
                } else {
                    //更新进度
                    progressView.setProgress(newProgress);
                }
                super.onProgressChanged(view, newProgress);
            }
        }
    
        /**
         * dp转换成px
         *
         * @param context Context
         * @param dp      dp
         * @return px值
         */
        private int dp2px(Context context, float dp) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dp * scale + 0.5f);
        }
    
    }
    

    主要是通过MyWebCromeClient 的onProgressChanged方法里面的进度值调用progressView.setProgress()方法去更新进度条,当加载100%的时候让进度条消失。恩,一个带加载进度条的WebView 就实现了!如果需要其他进度条效果,可以按需扩展~

    最后再贴一下代码地址:带进度条的Webview

    相关文章

      网友评论

      • NewInstance:这个在进度条存在时往上推进度条就没了
      • thisfeng:多写个ProgressView写个有点很麻烦。直接获取一个布局添加进 webView 即可
        我的做法是在配置 WebChromeClient 中先获取到布局
        1./* 获取加载进度layout 并添加至父类webView中 */
        View loadingLayout = LayoutInflater.from(context).inflate(R.layout.webview_load, webView);//内部只是一个ProgressBar 获取到之后拿到 progressBar 之后做判断
        2. 在onProgressChanged方法中进行判断

        if (newProgress == 100) {
        progressBar.setVisibility(View.INVISIBLE);
        // view.removeView(loadingLayout); /*若只想加载一次progressBar则开启这句*/
        } else {
        if (View.INVISIBLE == progressBar.getVisibility()) {
        progressBar.setVisibility(View.VISIBLE);
        }
        progressBar.setProgress(newProgress);
        }
        thisfeng:@thisfeng private void initWebChromeClient() {

        /* 获取加载进度layout 并添加至父类webView中 */
        View loadingLayout = LayoutInflater.from(context).inflate(R.layout.webview_load, webView);
        ProgressBar progressBar = loadingLayout.findViewById(R.id.progressBar);

        webView.setWebChromeClient(new WebChromeClient() {


        /* 获得网页的加载进度 */
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == 100) {
        progressBar.setVisibility(View.INVISIBLE);
        // view.removeView(loadingLayout); /*若只想加载一次progressBar则开启这句*/
        } else {
        if (View.INVISIBLE == progressBar.getVisibility()) {
        progressBar.setVisibility(View.VISIBLE);
        }
        progressBar.setProgress(newProgress);
        }
        super.onProgressChanged(view, newProgress);
        }
        thisfeng:@Ellite 这些 就是进度条所有的代码配置。注意inflate()的第二个参数,依附在webView中 , onProgressChanged() 方法是 webView.setWebChromeClient( ) WebChromeClient 中的方法
        Ellite:有源码参考没有呀、

      本文标题:Android 编写一个带进度条的Webview

      本文链接:https://www.haomeiwen.com/subject/eyiiottx.html