【Android】可以全屏播放視頻的WebView

前段時(shí)間項(xiàng)目遇到一個(gè)用H5播放視頻的需求吃粒,要求能全屏播放視頻,但是WebView原生并沒(méi)有實(shí)現(xiàn)全屏播放的需求赞别,不過(guò)也并沒(méi)有完全無(wú)法實(shí)現(xiàn)全屏焦履,通過(guò)WebChromeClient來(lái)暴露了兩個(gè)接口:onShowCustomView和onHideCustomView來(lái)控制全屏播放的顯示與隱藏,可以通過(guò)這兩個(gè)方法來(lái)實(shí)現(xiàn)視頻的全屏播放功能视卢。下邊分析一下具體的需求:

1踱卵、需求

1、能全屏播放視頻
2据过、全屏播放時(shí)需要展示title(可以為手動(dòng)傳入惋砂,默認(rèn)截取域名)
3、title動(dòng)畫(huà)效果
4绳锅、title樣式(高度背景顏色和返回按鈕可配置)
5西饵、返回鍵響應(yīng)

2、實(shí)現(xiàn)

WebChromeClient實(shí)現(xiàn)如下:

WebChromeClient chromeClient = new WebChromeClient() {

    @Nullable
    @Override
    public View getVideoLoadingProgressView() {
        return super.getVideoLoadingProgressView();
    }

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        showCustomView(view, callback);
        //展示全屏設(shè)置為橫屏
        mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

    @Override
    public void onHideCustomView() {
        hideCustomView();
        //隱藏全屏設(shè)置為豎屏
        mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
};

除了showCustomView和hideCustomView兩個(gè)方法外鳞芙,還需要根據(jù)全屏的展示和隱藏來(lái)設(shè)置Activity的橫豎屏眷柔。下邊來(lái)看展示和隱藏全屏的兩個(gè)方法的具體代碼:

private void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {
    if (mCustomView != null) {
        if (callback != null) {
            callback.onCustomViewHidden();
        }

        return;
    }

    FrameLayout decorView = (FrameLayout) mActivity.getWindow().getDecorView();
    decorView.setBackgroundColor(Color.BLACK);
    mFullContainerView = new FrameLayout(mActivity) {
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                if (mTitleView != null) {
                    if (!mTitleShow) {
                        mTitleShow = true;
                        if (mHideAnimator != null) {
                            mHideAnimator.cancel();
                        }
                        mShowAnimator = ObjectAnimator.ofFloat(mTitleView, ALPHA, mShowAlpha, 1);
                        mShowAnimator.setDuration(1000);
                        mShowAnimator.start();

                        hideTitleView();
                    } else {
                        mTitleShow = false;
                        if (mShowAnimator != null) {
                            mShowAnimator.cancel();
                        }

                        mHideAnimator = ObjectAnimator.ofFloat(mTitleView, ALPHA, 1, 0);
                        mHideAnimator.addListener(new AnimatorListenerAdapter() {

                            @Override
                            public void onAnimationEnd(Animator animation) {
                                mShowAlpha = (float) ((ObjectAnimator) animation).getAnimatedValue();
                                super.onAnimationEnd(animation);
                            }

                        });
                        mHideAnimator.setDuration(1000);
                        mHideAnimator.start();

                        if (mHideRun != null) {
                            mHandler.removeCallbacks(mHideRun);
                        }
                    }

                }
            }
            return super.dispatchTouchEvent(ev);
        }
    };
    mFullContainerView.setBackgroundColor(Color.BLACK);
    mFullContainerView.addView(view, FULL_SCREEN_PARAMS);
    if (mIsShowTitleView) {
        if (mTitleView == null) {
            mTitleView = createTitleView();
        }
        mFullContainerView.addView(mTitleView);
        mTitleShow = true;
        hideTitleView();
    }
    decorView.addView(mFullContainerView, FULL_SCREEN_PARAMS);
    mCustomView = view;
    setStatusBarVisibility(false);
    mCustomViewCallBack = callback;
}

首先判斷全屏View是否為空,不為空說(shuō)明當(dāng)前還處在全屏狀態(tài)原朝,作為異常處理驯嘱,調(diào)用WebChromeClient.CustomViewCallback的onCustomViewHidden()方法隱藏全屏。接著獲取當(dāng)前Activity的DecorView竿拆,作為容器來(lái)容納全屏播放的View宙拉。創(chuàng)建一個(gè)FrameLayout對(duì)象來(lái)作為全屏播放的容器,在創(chuàng)建時(shí)丙笋,對(duì)dispatchTouchEvent方法進(jìn)行了復(fù)寫(xiě)谢澈,用來(lái)實(shí)現(xiàn)title展示的動(dòng)畫(huà)效果,其中的hideTitleView()內(nèi)部是用Handler實(shí)現(xiàn)了一個(gè)2秒鐘后title消失的定時(shí)器御板。參數(shù)中的view是視頻的容器锥忿,將其加入到我們創(chuàng)建的容器中,然后將自定義實(shí)現(xiàn)的TitleView加入其中怠肋。最后將我們創(chuàng)建的容器放入Activity的容器中敬鬓。接下來(lái)是隱藏全屏的具體代碼;

private void hideCustomView() {
    if (mCustomView == null) {
        return;
    }

    setStatusBarVisibility(true);
    FrameLayout decorView = (FrameLayout) mActivity.getWindow().getDecorView();
    decorView.removeView(mFullContainerView);
    mFullContainerView = null;
    mCustomView = null;
    mCustomViewCallBack.onCustomViewHidden();
    mTitleView = null;
    mTitleShow = false;
    mHandler.removeCallbacks(mHideRun);
    mHandler = null;
    setVisibility(VISIBLE);
}

首先就是一場(chǎng)情況判斷笙各,如果mCustomView為空钉答,表示當(dāng)前不在全屏狀態(tài),則不用繼續(xù)執(zhí)行下邊的代碼杈抢,直接返回数尿。然后設(shè)置顯示狀態(tài)欄,并將全屏展示的View從Activity的容器中移除惶楼。并將實(shí)現(xiàn)動(dòng)畫(huà)效果的Handler移除右蹦。接下來(lái)處理返回按鈕點(diǎn)擊事件:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            if (mCustomView != null) {
                hideCustomView();
            } else if (canGoBack()) {
                goBack();
            } else {
                mActivity.finish();
            }
            return true;
        default:
            return super.onKeyUp(keyCode, event);
    }
}

優(yōu)先級(jí)為:隱藏全屏-網(wǎng)頁(yè)回退-銷(xiāo)毀當(dāng)前Activity诊杆。這些都完成以后,就擁有了一個(gè)可以全屏播放視頻的WebView何陆。

備注:必須將使用該WebView的Activity在AndroidManifest中設(shè)置為android:configChanges="orientation|screenSize|keyboardHidden"晨汹,不然會(huì)在全屏?xí)r重新執(zhí)行Activity的生命周期,導(dǎo)致頁(yè)面重繪贷盲。另該WebView已上傳至JCenter淘这,若需要使用,則在build.gradle中添加依賴即可巩剖。

implementation 'com.wanggle.videowebview:videowebview:1.0.1'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慨灭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子球及,更是在濱河造成了極大的恐慌,老刑警劉巖呻疹,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃引,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刽锤,警方通過(guò)查閱死者的電腦和手機(jī)镊尺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)并思,“玉大人庐氮,你說(shuō)我怎么就攤上這事∷伪耍” “怎么了弄砍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)输涕。 經(jīng)常有香客問(wèn)我音婶,道長(zhǎng),這世上最難降的妖魔是什么莱坎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任衣式,我火速辦了婚禮,結(jié)果婚禮上檐什,老公的妹妹穿的比我還像新娘碴卧。我一直安慰自己,他們只是感情好乃正,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布住册。 她就那樣靜靜地躺著,像睡著了一般烫葬。 火紅的嫁衣襯著肌膚如雪界弧。 梳的紋絲不亂的頭發(fā)上凡蜻,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音垢箕,去河邊找鬼划栓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛条获,可吹牛的內(nèi)容都是我干的忠荞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帅掘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼委煤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起修档,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碧绞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吱窝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體讥邻,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年院峡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兴使。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡照激,死狀恐怖发魄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俩垃,我是刑警寧澤励幼,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站口柳,受9級(jí)特大地震影響赏淌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啄清,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一六水、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辣卒,春花似錦掷贾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啡莉,卻和暖如春港准,著一層夾襖步出監(jiān)牢的瞬間旨剥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工浅缸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轨帜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓衩椒,卻偏偏與公主長(zhǎng)得像蚌父,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毛萌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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