实际效果可以参看微信的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);
        }
 
    }

最新文章

  1. mybatis问题is not known to the MapperRegistry
  2. webkit的一些不为人知的高级属性
  3. Txx考试(codevs 2894)
  4. WPF入口Application
  5. image 与 canvas 的相互转化
  6. 拆分Sql列中内容的拆分
  7. JAVA的RSA加密算法工具类
  8. RecycleView 瀑布流滑动移位
  9. node.js介绍
  10. eclipse新建workspace使用之前workspace的个性配置
  11. 关于报错:AttributeError: module &#39;turtle&#39; has no attribute &#39;setup&#39; 问题
  12. Mac操作系统下忘记MYSQL的密码
  13. 利用sfc文件构建网络渗透
  14. 分布式进阶(八)Linux提示Unable to locate package该如何处理?
  15. windows下搭建Kafka,并通过命令窗口收发消息
  16. Linux启动/停止/重启Mysql数据库
  17. WinHex数据恢复笔记(一)
  18. FastCGI点滴
  19. in_array的三个参数
  20. linux下如何添加一个用户并且让用户获得root权限 备用

热门文章

  1. 使用RockMongo管理MongoDB
  2. C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别
  3. Android核心分析之二十四Android GDI之显示缓冲管理
  4. React-非dom属性-key
  5. JTAG的SWD接线方式
  6. apimonitor
  7. wordpress可视化编辑器的开启/关闭
  8. CentOS增加硬盘
  9. nandflash学习1——导致nandflash反转的原因【转】
  10. 16.allegro元件手动摆放[原创]