实际效果可以参看微信的web页面进度条
本质就是通过addView及对WebView 页面进度进行监听
先看看这个自定义的DrawableId,我们参照系统默认实现的方法写一个自己的
 
<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="#ff7d1a"
                    android:centerColor="#ff7d1a"
                    android:centerY="0.75"
                    android:endColor="#ff7d1a"
                    android:angle="270"
                    />
            </shape>
        </clip>
    </item>
 
</layer-list>
实际还有一个secondProgress的属性,这个也随意设置,一般用不到
 
void init(Context context) {
        if (context == null)
            return;
        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
        layoutParams.topMargin = 48;//该属性定义距离父类View顶部多少,pix级别
 
        if (progressbar != null) {
            progressbar.setLayoutParams(layoutParams);
            if (drawable != null) {
                progressbar.setProgressDrawable(drawable);//将我们自定义的drawable放进来,长相就定了
                progressbar.setIndeterminate(false);//此值表明进度是不明确的,我们并不知道具体进度是多少
            }
        }
        if (layoutParent == null)
            return;
        viewGroupParent.addView(progressbar);
        if (webView == null)
            return;
        webView.setWebChromeClient(new WebChromeClient());//给webview提供一个可以监听进度的对象,系统内的WebChromeClient 已经有了这个进度通知方法
    }
 
    public class WebChromeClient extends android.webkit.WebChromeClient {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
 
 
            if (newProgress >= 99) {//这个临界值是用来改变显示状态,告诉我们页面加载完了,你progressbar可以隐藏了,此值随意,觉得多少合适就用多少
                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(5);//平缓增加
                        }
                    }
                });
            }
            super.onProgressChanged(view, newProgress);
        }
 
    }

WebView增加一个水平Progress,位置、长相随意的更多相关文章

  1. 如何在属性面板中增加一个属性-UI界面编辑器(XproerUI)教程

    版权所有 2009-2015 荆门泽优软件有限公司 保留所有权利 产品首页:http://www.ncmem.com/apps/xproerui/index.asp 开发文档(SkinStudio): ...

  2. echarts之简单的入门——【二】再增加一个柱状图和图例组件

    echarts之简单的入门——[一]做个带时间轴的柱状统计图 现在需求说,我需要知道日答题总次数和活跃人数,那么我们如何在上面的图表中增加一个柱状图呢? 如果你看过简单入门中的配置项手册中series ...

  3. Rails 增加一个模型(model)

      之前我们已经看到用脚手架运行的model程序.现在是时候第二个model了. 第二个model用来处理post的评论. 7.1 新建一个模型 Rails模型使用一个单一的的名称,其相应的数据库表使 ...

  4. 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...

  5. Add an Item to the New Action 在新建按钮中增加一个条目

    In this lesson, you will learn how to add an item to the New Action (NewObjectViewController.NewObje ...

  6. Numpy怎样给数组增加一个维度

    Numpy怎样给数组增加一个维度 背景:很多数据计算都是二维或三维的,对于一维的数据输入为了形状匹配,经常需升维变成二维 需要:在不改变数据的情况下,添加数组维度:(注意观察这个例子,维度变了,但数据 ...

  7. Vertica增加一个数据存储的目录

    Vertica增加一个数据存储的目录 操作语法为: ADD_LOCATION ( 'path' , [ 'node' , 'usage', 'location_label' ] ) 各节点添加目录,并 ...

  8. android源码中,在系统多媒体数据库中增加一个字段

    由于项目需求,在系统多媒体管理数据库里的存储图像文件的表中需要新增加一个字段,源码在:项目\packages\providers\MediaProvider\MediaProvider.java下,在 ...

  9. Ecshop 后台增加一个左侧列表菜单menu菜单的方法

    Ecshop 后台增加一个左侧列表菜单menu菜单需要修改三个文件:/admin/includes/inc_menu.php/admin/includes/inc_priv.php/languages ...

随机推荐

  1. C Primer Plus之结构和其他数据形式

    声明和初始化结构指针 声明结构化指针,例如: struct guy * him; 初始化结构指针(如果barney是一个guy类型的结构),例如: him = &barney; 注意:和数组不 ...

  2. amcharts简单封装

    只是简单是封装了一下,目前只能输出线图(折现,圆滑线等),柱状图. 代码如下: ;!function(win,$,AC,undefined){ var DDcharts = function(o){ ...

  3. 李洪强iOS开发之下载

    // // //  LHQDownLoader.m //  A21 - 李洪强 - 下载 // //  Created by vic fan on 16/7/3. //  Copyright © 20 ...

  4. iOS开发--自动布局

    距离左边的: 距离顶部的: 距离右边的: 距离底部的:

  5. WebBrowser控件应用:弹出新窗体和关闭窗口

    缘起:上次写了一个<WebBrowser控件的简单应用2>,提到了在NewWindow事件中打开新窗口的例子.有网友“队长 ”提出那个事件得到的参数是本页面的,而不是新页面的,经过测试,果 ...

  6. Linux 下Git的安装和配置

    Git是分布式的版本控制系统,实际上是不需要固定的服务器的,Git与svn的最大区别是,它的使用流程不需要联机,可以先将对代码的修改,评论,保存在本机.等上网之后,再实时推送过去.同时它创建分支与合并 ...

  7. 快速获取Windows系统上的国家和地区信息

    Windows系统上包含了200多个国家和地区的数据,有时候编程需要这些资料.以下代码可以帮助你快速获取这些信息.将Console语句注释掉,可以更快的完成分析. static void Main(s ...

  8. js中的编码与解码

    一.encodeURI()定义和用法 encodeURI() 函数可把字符串作为 URI 进行编码. 语法 encodeURI(URIstring) 参数 描述 URIstring 必需.一个字符串, ...

  9. js 去空格函数与正则

    如果项目没有用到jQuery等框架的话,js本身又没有这样的函数,我们不得不自己写这样的函数,下面是函数的具体实现: //供使用者调用 function trim(s){ return trimRig ...

  10. JavaScript —— 局部变量和全局变量

    JS的全局变量有3种声明方式: 1.Function 外 var v_myVar; 2.Function 内 v_myVar; 3.window.v_myVar window.v_myVar 全局变量 ...