V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Registering
V2EX  ›  问与答

webview 加载进度,渲染进度

  •  
  •   Registering · 2015-04-21 11:23:30 +08:00 · 3405 次点击
    这是一个创建于 3506 天前的主题,其中的信息可能已经有所发展或是发生改变。
    打开微信公众号的一篇文章时,头部有一个进度条显示,请问这个怎么实现,求个思路?

    new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress) {

    }
    }

    使用这个回调貌似不精准,
    9 条回复    2015-04-21 20:45:35 +08:00
    Archangel_SDY
        1
    Archangel_SDY  
       2015-04-21 11:36:08 +08:00
    其实很多浏览器的进度条是假的...
    quix
        2
    quix  
       2015-04-21 12:10:48 +08:00
    应该是根据事件的... 我观察下来基本就是页面下载完了更新一下进度, 比如到20%, dom 下载完更新一下, 然后图片等资源全部下载完再更新一次
    learnshare
        3
    learnshare  
       2015-04-21 12:15:27 +08:00
    不应该是网页提供这个效果么,浏览器不太容易抓到已经下载了 5/10 个文件这种数据吧
    kzzhr
        4
    kzzhr  
       2015-04-21 12:21:30 +08:00 via Android
    某浏览器经常进度条到90%然后等半天
    某浏览器经常进度条到100%然后无法访问
    某浏览器,对了你可以拿个gif实现,简单快捷
    mthli
        5
    mthli  
       2015-04-21 13:18:41 +08:00 via Android
    目前我正在写一个浏览器,完成度90%+,你可以参考一下我的代码。

    项目地址: https://github.com/mthli/Berries

    关注一下Browser目录下BrowserController.java中updateProgress()接口的具体实现就可以 :)
    Registering
        6
    Registering  
    OP
       2015-04-21 13:58:50 +08:00
    @mthli
    没有IntelliJ IDEA,
    ,哥们不介意的话,讲讲你的实现思路,,:)
    mthli
        7
    mthli  
       2015-04-21 15:03:18 +08:00
    就是使用WebChromeClient中的onProgressChanged()方法呀,和你说的一样。精确度的话其实反映大概的情况了,如果不追求的十分准确的话。

    至于进度条,你只需要使用系统自带的ProgressBar就可以,在其属性中添加设置:
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:maxHeight="2dp"
    android:minWidth="2dp"
    android:indeterminate="false"
    android:indeterminateOnly="false"
    android:progressDrawable="@drawable/browser_progress_bar_layer_list"

    browser_progress_bar_layer_list.xml自定义内容参考这个链接:
    https://github.com/mthli/Berries/blob/master/Berries/res/drawable/browser_progress_bar_layer_list.xml

    然后使用WebChromeClient的onProgressChanged()方法获得当前的进度值,并且对ProgressBar添加一些动画:
    // progressBar是你自己的ProgressBar,
    // progress为当前进度值,
    // animTime是你自定义的动画时间
    ObjectAnimator animator = ObjectAnimator.ofInt(progressBar, "progress", progress);
    animator.setDuration(animTime);
    animator.setInterpolator(new DecelerateInterpolator());
    animator.start();

    大概按照以上步骤你就可以实现一个带动画效果推进的进度条了,进度条颜色啥的可以模仿browser_progress_bar_layer_list.xml自定义。
    Registering
        8
    Registering  
    OP
       2015-04-21 17:47:43 +08:00
    @mthli
    额,我觉得onProgressChanged方法应该是获得下载页面资源而已。。

    很多页面加载完资源,还要花费不少时间渲染页面,所以当progress的值到100时,经常发现页面还是没加载完,,,

    所以在找方法能更精确。

    微信的公众号加载文章时的效果还OK
    mthli
        9
    mthli  
       2015-04-21 20:45:35 +08:00
    @Registering 微信应该用的是它自己的浏览器内核吧,和系统自带的应该不一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:49 · PVG 05:49 · LAX 13:49 · JFK 16:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.