項(xiàng)目需求討論-WebView進(jìn)度加載條

又到了每次的實(shí)際項(xiàng)目開(kāi)發(fā)中的需求討論了。這次是因?yàn)樽龅捻?xiàng)目是原生內(nèi)嵌WebView倔约,所以當(dāng)我們的WebView在加載網(wǎng)頁(yè)的時(shí)候秃殉,需要有個(gè)加載進(jìn)度條,當(dāng)然這時(shí)候有很多種選擇浸剩,但是因?yàn)槠胀ǖ膶?duì)話(huà)框類(lèi)型的加載框太丑钾军,我們就舍棄掉了,而是模仿微信里面的進(jìn)度加載條绢要,也就是在WebView 的頂部會(huì)有一條線來(lái)顯示加載進(jìn)度吏恭。(也就是下方GIF圖中的那個(gè)紫紅色的進(jìn)度條,別問(wèn)我為啥用紫紅色重罪。我就覺(jué)得用這個(gè)顏色更加明顯點(diǎn)樱哼。O(∩_∩)O~)

聲明大家不要噴哈,有問(wèn)題可以評(píng)論反饋蛆封。我做的可能也不是很好

先附上Demo:DEMO

一些關(guān)于WebView的基礎(chǔ)我就不說(shuō)了唇礁。大家可以看看
Android之WebView快速上手


OK ,進(jìn)入我們的正題,我們先要知道怎么監(jiān)聽(tīng)到網(wǎng)頁(yè)加載的進(jìn)度惨篱。

監(jiān)聽(tīng)網(wǎng)頁(yè)加載進(jìn)度:

我們按照上面的Android之WebView快速上手所說(shuō)的:

我們知道了WebChromeClient中有個(gè)onProgressChanged方法可以用來(lái)監(jiān)聽(tīng)盏筐,所以我們復(fù)寫(xiě)onProgressChanged方法:

WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
        ....
        ....
        ....
     
    }
});

好了,我們現(xiàn)在在訪問(wèn)網(wǎng)頁(yè)的時(shí)候已經(jīng)可以拿到了進(jìn)度值了砸讳。也就是newProgress琢融。這里要注意一個(gè)問(wèn)題界牡,那就是如果你在這里打上Log你會(huì)發(fā)現(xiàn),這個(gè)newProgress值不是說(shuō)按我們想象中那樣漾抬,從0慢慢到100宿亡,可能就是(0->16->30->100)就返回這四次數(shù)字。所以如果我們直接讓我們的進(jìn)度條按照它的newProgress值來(lái)變化纳令,就有個(gè)問(wèn)題挽荠,那就是會(huì)變化特別大,而且速度也特別快平绩。體驗(yàn)一點(diǎn)也不好圈匆。所以這里我處理方式是,當(dāng)newProgress 大于85 的時(shí)候捏雌,讓他慢慢的在特定時(shí)間內(nèi)加載完剩下的進(jìn)度跃赚,這樣給人的感覺(jué)也是很平穩(wěn)的


自定義進(jìn)度條:

其實(shí)這個(gè)自定義進(jìn)度條很簡(jiǎn)單,其實(shí)就是畫(huà)了一個(gè)矩形性湿,然后矩形的width就是根據(jù)我們拿到的網(wǎng)頁(yè)的進(jìn)度來(lái)實(shí)時(shí)的變化:

public class WebProgressBarView extends View{
    
    ....
    ....
    ....

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = MeasureSpec.getSize(widthMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        float result = mWidth * ((float) mCurProgress / (float) 100);
        canvas.drawRect(0, 0, result, mHeight, mPaint);
    }
}

我們?cè)谏厦嫣岬轿嘲痢N覀冊(cè)诖笥?5的時(shí)候,讓他慢慢的加載完畢肤频,所以我們這里要有二個(gè)方法:

  1. 正常方法:
public void setNormalProgress(int mCurProgress){
    this.mCurProgress = mCurProgress;
    postInvalidate();
}

2.慢慢加載的方法:

public void setCurProgress(long time, final EventEndListener endListener){
        ValueAnimator animator = ValueAnimator.ofInt(mCurProgress,100);
        animator.setDuration(time);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                setNormalProgress((Integer) animation.getAnimatedValue());
            }
        });

        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                 if(endListener != null){
                     endListener.onEndEvent();
                 }
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });

        animator.start();

    }

繼續(xù)補(bǔ)充onProgressChanged方法:

既然我們寫(xiě)好了自定義進(jìn)度條的View ,我們回頭再來(lái)補(bǔ)充下onProgressChanged方法:

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);

        //如果進(jìn)度條隱藏則讓它顯示
        if (View.GONE == progressBarView.getVisibility()) {
            progressBarView.setVisibility(View.VISIBLE);
        }

        if (newProgress >= 85) {
            if (isContinue) {
                return;
            }
            isContinue = true;
            progressBarView.setCurProgress(1000, new WebProgressBarView.EventEndListener() {
                @Override
                public void onEndEvent() {
                    isContinue = false;
                    if (progressBarView.getVisibility() == View.VISIBLE) {
                        hideProgress();
                    }
                }
            });
        } else {
            progressBarView.setNormalProgress(newProgress);
        }
    }
});

我們看到了叹括。我們的進(jìn)度大于85的話(huà),就在一秒鐘內(nèi)慢慢的加載完着裹,加載完后調(diào)用hideProgress方法來(lái)隱藏進(jìn)度條领猾,

private void hideProgressWithAnim() {
    AnimationSet animation = getDismissAnim(MainActivity.this);
    animation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            progressBarView.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });
    progressBarView.startAnimation(animation);
}

private AnimationSet getDismissAnim(Context context) {
    AnimationSet dismiss = new AnimationSet(context, null);
    AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);
    alpha.setDuration(1000);
    dismiss.addAnimation(alpha);
    return dismiss;
}


問(wèn)題:

實(shí)際操作中的問(wèn)題,這里我也遇到問(wèn)題:

  1. 那就是網(wǎng)頁(yè)加載沒(méi)有想象中那樣加載一次骇扇。網(wǎng)頁(yè)可能會(huì)有重定向跳轉(zhuǎn)這種,雖然你可能感覺(jué)就打開(kāi)了一個(gè)鏈接面粮,你會(huì)發(fā)現(xiàn)newProgress 從0 -> 100后少孝,會(huì)再多次調(diào)用0->100。這里我不知道一般大家在做其他APP的WebView進(jìn)度條的時(shí)候熬苍,是按照它真實(shí)的newProgress來(lái)加載稍走,也就是加載了一次全的,然后進(jìn)度條重新加載一次柴底,再加載一次婿脸。還是說(shuō)只加載第一次的0->100的進(jìn)度條。
  2. 我本來(lái)想加載第一次進(jìn)度條柄驻,后面的newProgress的重新0->100我就不管了狐树。我就想到重寫(xiě)WebViewClient,因?yàn)槔锩嬗卸€(gè)方法:
//當(dāng)網(wǎng)頁(yè)加載完畢后這個(gè)方法會(huì)被回調(diào)
public void onPageFinished (WebView view, String url)
//當(dāng)網(wǎng)頁(yè)開(kāi)始加載時(shí)這個(gè)方法會(huì)被回調(diào)
public void onPageStarted (WebView view, String url, Bitmap favicon)

然后我就想到定義一個(gè)boolean值鸿脓,這樣豈不是可以在這二個(gè)方法里面賦值抑钟,然后用來(lái)控制涯曲。
可是我打了Log發(fā)現(xiàn),比如我WebView打開(kāi)的是https://www.baidu.com在塔,然后打開(kāi)顯示的百度首頁(yè)中某個(gè)新聞,onPageStarted并不會(huì)調(diào)用幻件。而onPageFinished還是會(huì)被調(diào)用,我想了解下什么時(shí)候onPageStarted不會(huì)被去調(diào)用蛔溃。 ╮(╯﹏╰)╭

如果大家能幫忙答疑就謝謝了绰沥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贺待,隨后出現(xiàn)的幾起案子揪利,更是在濱河造成了極大的恐慌,老刑警劉巖狠持,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疟位,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喘垂,警方通過(guò)查閱死者的電腦和手機(jī)甜刻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)正勒,“玉大人得院,你說(shuō)我怎么就攤上這事≌抡辏” “怎么了祥绞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鸭限。 經(jīng)常有香客問(wèn)我蜕径,道長(zhǎng),這世上最難降的妖魔是什么败京? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任兜喻,我火速辦了婚禮,結(jié)果婚禮上赡麦,老公的妹妹穿的比我還像新娘朴皆。我一直安慰自己,他們只是感情好泛粹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布遂铡。 她就那樣靜靜地躺著,像睡著了一般晶姊。 火紅的嫁衣襯著肌膚如雪扒接。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音珠增,去河邊找鬼超歌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒂教,可吹牛的內(nèi)容都是我干的巍举。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凝垛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懊悯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梦皮,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炭分,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后剑肯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捧毛,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年让网,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呀忧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溃睹,死狀恐怖而账,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情因篇,我是刑警寧澤泞辐,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站竞滓,受9級(jí)特大地震影響咐吼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虽界,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一汽烦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莉御,春花似錦、人聲如沸俗冻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迄薄。三九已至琅关,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涣易。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工画机, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人新症。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓步氏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親徒爹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荚醒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Animation Animation類(lèi)是所有動(dòng)畫(huà)(scale、alpha隆嗅、translate界阁、rotate)的基...
    四月一號(hào)閱讀 1,900評(píng)論 0 10
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,518評(píng)論 25 707
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 一胖喳、概述 在Android動(dòng)畫(huà)中泡躯,總共有兩種類(lèi)型的動(dòng)畫(huà)View Animation(視圖動(dòng)畫(huà))和Property ...
    summer_lz閱讀 741評(píng)論 1 0
  • 在外地讀書(shū)的孩子最大的痛苦應(yīng)該就是回家還得在路上舟車(chē)勞頓好幾天,回到家就已經(jīng)精疲力盡無(wú)力吐槽丽焊,休整幾天就會(huì)發(fā)現(xiàn)暑假...
    小烈吶閱讀 196評(píng)論 0 1