Android編程實(shí)現(xiàn)WebView全屏播放的方法(附源碼)
本文實(shí)例講述了Android編程實(shí)現(xiàn)WebView全屏播放的方法。分享給大家供大家參考,具體如下:
最近因?yàn)轫?xiàng)目要用webview加載html5的視頻,開始不能全屏播,做了很久才做出來!那按我的理解說下怎么實(shí)現(xiàn)全屏吧。
首先寫布局文件activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/video_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="gone" ></FrameLayout> <Button android:id="@+id/video_landport" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="全屏不顯示該按扭,點(diǎn)擊切換橫屏" android:gravity="center" /> <WebView android:id="@+id/video_webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
原理:實(shí)現(xiàn)全屏的時(shí)候把webview里的視頻放到一個(gè)View(布局里的video_view控件)里面,然后把webview隱藏掉!這樣就實(shí)現(xiàn)了全屏播放的!
現(xiàn)在具體來看看怎么實(shí)現(xiàn)的:
先放代碼MainActivity.java:
public class MainActivity extends Activity { private FrameLayout videoview;// 全屏?xí)r視頻加載view private Button videolandport; private WebView videowebview; private Boolean islandport = true;//true表示此時(shí)是豎屏,false表示此時(shí)橫屏。 private View xCustomView; private xWebChromeClient xwebchromeclient; private String url = "http://look.appjx.cn/mobile_api.php?mod=news&id=12604"; private WebChromeClient.CustomViewCallback xCustomViewCallback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉應(yīng)用標(biāo)題 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); initwidget(); initListener(); videowebview.loadUrl(url); } private void initListener() { // TODO Auto-generated method stub videolandport.setOnClickListener(new Listener()); } private void initwidget() { // TODO Auto-generated method stub videoview = (FrameLayout) findViewById(R.id.video_view); videolandport = (Button) findViewById(R.id.video_landport); videowebview = (WebView) findViewById(R.id.video_webview); WebSettings ws = videowebview.getSettings(); /** * setAllowFileAccess 啟用或禁止WebView訪問文件數(shù)據(jù) setBlockNetworkImage 是否顯示網(wǎng)絡(luò)圖像 * setBuiltInZoomControls 設(shè)置是否支持縮放 setCacheMode 設(shè)置緩沖的模式 * setDefaultFontSize 設(shè)置默認(rèn)的字體大小 setDefaultTextEncodingName 設(shè)置在解碼時(shí)使用的默認(rèn)編碼 * setFixedFontFamily 設(shè)置固定使用的字體 setJavaSciptEnabled 設(shè)置是否支持Javascript * setLayoutAlgorithm 設(shè)置布局方式 setLightTouchEnabled 設(shè)置用鼠標(biāo)激活被選項(xiàng) * setSupportZoom 設(shè)置是否支持變焦 * */ ws.setBuiltInZoomControls(true);// 隱藏縮放按鈕 ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版適應(yīng)屏幕 ws.setUseWideViewPort(true);// 可任意比例縮放 ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法設(shè)置webview推薦使用的窗口。setLoadWithOverviewMode方法是設(shè)置webview加載的頁面的模式。 ws.setSavePassword(true); ws.setSaveFormData(true);// 保存表單數(shù)據(jù) ws.setJavaScriptEnabled(true); ws.setGeolocationEnabled(true);// 啟用地理定位 ws.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");// 設(shè)置定位的數(shù)據(jù)庫路徑 ws.setDomStorageEnabled(true); xwebchromeclient = new xWebChromeClient(); videowebview.setWebChromeClient(xwebchromeclient); videowebview.setWebViewClient(new xWebViewClientent()); } class Listener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.video_landport: if (islandport) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); videolandport.setText("全屏不顯示該按扭,點(diǎn)擊切換橫屏"); }else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); videolandport.setText("全屏不顯示該按扭,點(diǎn)擊切換豎屏"); } break; default: break; } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (inCustomView()) { hideCustomView(); return true; }else { videowebview.loadUrl("about:blank"); // mTestWebView.loadData("", "text/html; charset=UTF-8", null); MainActivity.this.finish(); Log.i("testwebview", "===>>>2"); } } return true; } /** * 判斷是否是全屏 * @return */ public boolean inCustomView() { return (xCustomView != null); } /** * 全屏?xí)r按返加鍵執(zhí)行退出全屏方法 */ public void hideCustomView() { xwebchromeclient.onHideCustomView(); } /** * 處理Javascript的對(duì)話框、網(wǎng)站圖標(biāo)、網(wǎng)站標(biāo)題以及網(wǎng)頁加載進(jìn)度等 * @author */ public class xWebChromeClient extends WebChromeClient { private Bitmap xdefaltvideo; private View xprogressvideo; @Override //播放網(wǎng)絡(luò)視頻時(shí)全屏?xí)徽{(diào)用的方法 public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { if (islandport) { } else{ // ii = "1"; // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); videowebview.setVisibility(View.GONE); //如果一個(gè)視圖已經(jīng)存在,那么立刻終止并新建一個(gè) if (xCustomView != null) { callback.onCustomViewHidden(); return; } videoview.addView(view); xCustomView = view; xCustomViewCallback = callback; videoview.setVisibility(View.VISIBLE); } @Override //視頻播放退出全屏?xí)徽{(diào)用的 public void onHideCustomView() { if (xCustomView == null)//不是全屏播放狀態(tài) return; // Hide the custom view. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); xCustomView.setVisibility(View.GONE); // Remove the custom view from its container. videoview.removeView(xCustomView); xCustomView = null; videoview.setVisibility(View.GONE); xCustomViewCallback.onCustomViewHidden(); videowebview.setVisibility(View.VISIBLE); //Log.i(LOGTAG, "set it to webVew"); } //視頻加載添加默認(rèn)圖標(biāo) @Override public Bitmap getDefaultVideoPoster() { //Log.i(LOGTAG, "here in on getDefaultVideoPoster"); if (xdefaltvideo == null) { xdefaltvideo = BitmapFactory.decodeResource( getResources(), R.drawable.videoicon); } return xdefaltvideo; } //視頻加載時(shí)進(jìn)程loading @Override public View getVideoLoadingProgressView() { //Log.i(LOGTAG, "here in on getVideoLoadingPregressView"); if (xprogressvideo == null) { LayoutInflater inflater = LayoutInflater.from(MainActivity.this); xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null); } return xprogressvideo; } //網(wǎng)頁標(biāo)題 @Override public void onReceivedTitle(WebView view, String title) { (MainActivity.this).setTitle(title); } // @Override // //當(dāng)WebView進(jìn)度改變時(shí)更新窗口進(jìn)度 // public void onProgressChanged(WebView view, int newProgress) { // (MainActivity.this).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100); // } } /** * 處理各種通知、請(qǐng)求等事件 * @author */ public class xWebViewClientent extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.i("webviewtest", "shouldOverrideUrlLoading: "+url); return false; } } /** * 當(dāng)橫豎屏切換時(shí)會(huì)調(diào)用該方法 * @author */ @Override public void onConfigurationChanged(Configuration newConfig) { Log.i("testwebview", "=====<<< onConfigurationChanged >>>====="); super.onConfigurationChanged(newConfig); if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ Log.i("webview", " 現(xiàn)在是橫屏1"); islandport = false; }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Log.i("webview", " 現(xiàn)在是豎屏1"); islandport = true; } } }
代碼里面我寫了好多注釋,相信大家都能看得懂,當(dāng)然本人是菜鳥,可能有些地方理解錯(cuò)了!知道的可以跟我說。然后我在里面加了一個(gè)功能,就是點(diǎn)擊webview上面按鈕切換橫豎屏!還有就是當(dāng)點(diǎn)擊全屏播放的時(shí)候強(qiáng)制橫屏全屏播放,點(diǎn)擊返回時(shí)回到豎屏!我這里沒有用手機(jī)重力感應(yīng)切換橫豎屏!代碼里面還加了個(gè)播放進(jìn)度的布局文件,大家在源碼里可以看到!
最后說下AndroidManifest.xml設(shè)置;
訪問網(wǎng)絡(luò)權(quán)限加上這句
當(dāng)切換橫豎屏?xí)r為了不重新調(diào)用onCreate等方法,要加個(gè)這句:
差不多這樣就可以實(shí)現(xiàn)全屏播放了,如果有看不懂的問題可以問我,
完整實(shí)例代碼代碼點(diǎn)擊此處本站下載。
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android 設(shè)置應(yīng)用全屏的兩種解決方法
- Android編程實(shí)現(xiàn)WebView自適應(yīng)全屏方法小結(jié)
- android activity設(shè)置無標(biāo)題實(shí)現(xiàn)全屏
- Android 全屏無標(biāo)題欄的三種實(shí)現(xiàn)方法
- android 設(shè)置全屏的兩種方法
- Android中3種全屏方法及3種去掉標(biāo)題欄的方法
- Android開發(fā)之全屏與非全屏的切換設(shè)置方法小結(jié)
- Android下Activity全屏顯示實(shí)現(xiàn)方法
- Android4.2中全屏或者取消標(biāo)題欄的方法總結(jié)
- Android實(shí)現(xiàn)布局全屏
相關(guān)文章
Android-Jetpack-Navigation組件使用示例
這篇文章主要介紹了Android-Jetpack-Navigation組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android 媒體開發(fā)之MediaPlayer狀態(tài)機(jī)接口方法實(shí)例解析
這篇文章主要介紹了Android 媒體開發(fā)之MediaPlayer狀態(tài)機(jī)接口方法實(shí)例解析,需要的朋友可以參考下2017-08-08Android TableLayout數(shù)據(jù)列表的回顯清空實(shí)現(xiàn)思路及代碼
數(shù)據(jù)列表的回顯必須從后面減去子元素同時(shí)必須從后面減去子元素,感興趣的朋友可以看下具體的實(shí)現(xiàn)代碼,希望對(duì)你學(xué)習(xí)Android TableLayout有所幫助2013-04-04Flutter 狀態(tài)管理的實(shí)現(xiàn)
這篇文章主要介紹了Flutter 狀態(tài)管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06非常實(shí)用的側(cè)滑刪除控件SwipeLayout
這篇文章主要為大家詳細(xì)介紹了非常實(shí)用的側(cè)滑刪除控件SwipeLayout,類似于QQ側(cè)滑點(diǎn)擊刪除效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Android UI之ImageView實(shí)現(xiàn)圖片旋轉(zhuǎn)和縮放
這篇文章主要介紹了Android UI之ImageView實(shí)現(xiàn)圖片旋轉(zhuǎn)和縮放的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09Android startService的使用與Service生命周期案例詳解
這篇文章主要介紹了Android startService的使用與Service生命周期案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09