• Android编程实现WebView全屏播放的方法


    这篇文章主要介绍了Android编程实现WebView全屏播放的方法,结合实例形式较为详细的分析了Android实现WebView全屏播放的布局与功能相关技巧,需要的朋友可以参考下!

    本文实例讲述了Android编程实现WebView全屏播放的方法。分享给大家供大家参考,具体如下:

    最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧。

    首先写布局文件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="全屏不显示该按扭,点击切换横屏"
      android:gravity="center"
      />
     <WebView
      android:id="@+id/video_webview"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      />
     </LinearLayout>
    View Code

    原理:实现全屏的时候把webview里的视频放到一个View(布局里的video_view控件)里面,然后把webview隐藏掉!这样就实现了全屏播放的!
    现在具体来看看怎么实现的:

    先放代码MainActivity.java:

    public class MainActivity extends Activity {
     private FrameLayout videoview;// 全屏时视频加载view
     private Button videolandport;
     private WebView videowebview;
     private Boolean islandport = true;//true表示此时是竖屏,false表示此时横屏。
     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);//去掉应用标题
      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访问文件数据 setBlockNetworkImage 是否显示网络图像
       * setBuiltInZoomControls 设置是否支持缩放 setCacheMode 设置缓冲的模式
       * setDefaultFontSize 设置默认的字体大小 setDefaultTextEncodingName 设置在解码时使用的默认编码
       * setFixedFontFamily 设置固定使用的字体 setJavaSciptEnabled 设置是否支持Javascript
       * setLayoutAlgorithm 设置布局方式 setLightTouchEnabled 设置用鼠标激活被选项
       * setSupportZoom 设置是否支持变焦
       * */
      ws.setBuiltInZoomControls(true);// 隐藏缩放按钮
      ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版适应屏幕
      ws.setUseWideViewPort(true);// 可任意比例缩放
      ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。
      ws.setSavePassword(true);
      ws.setSaveFormData(true);// 保存表单数据
      ws.setJavaScriptEnabled(true);
      ws.setGeolocationEnabled(true);// 启用地理定位
      ws.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");// 设置定位的数据库路径
      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("全屏不显示该按扭,点击切换横屏");
        }else {
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
         videolandport.setText("全屏不显示该按扭,点击切换竖屏");
        }
        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);
       }
       /**
       * 全屏时按返加键执行退出全屏方法
       */
       public void hideCustomView() {
        xwebchromeclient.onHideCustomView();
       }
     /**
      * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等
      * @author
      */
     public class xWebChromeClient extends WebChromeClient {
      private Bitmap xdefaltvideo;
      private View xprogressvideo;
      @Override
      //播放网络视频时全屏会被调用的方法
      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);
       //如果一个视图已经存在,那么立刻终止并新建一个
       if (xCustomView != null) {
        callback.onCustomViewHidden();
        return;
       }   
       videoview.addView(view);
       xCustomView = view;
       xCustomViewCallback = callback;
       videoview.setVisibility(View.VISIBLE);
      }
      @Override
      //视频播放退出全屏会被调用的
      public void onHideCustomView() {
       if (xCustomView == null)//不是全屏播放状态
        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");
      }
      //视频加载添加默认图标
      @Override
      public Bitmap getDefaultVideoPoster() {
       //Log.i(LOGTAG, "here in on getDefaultVideoPoster"); 
       if (xdefaltvideo == null) {
        xdefaltvideo = BitmapFactory.decodeResource(
          getResources(), R.drawable.videoicon);
       }
       return xdefaltvideo;
      }
      //视频加载时进程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; 
      }
      //网页标题
       @Override
       public void onReceivedTitle(WebView view, String title) {
       (MainActivity.this).setTitle(title);
       }
    //   @Override
    //  //当WebView进度改变时更新窗口进度
    //   public void onProgressChanged(WebView view, int newProgress) {
    //    (MainActivity.this).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
    //   }  
     }
     /**
      * 处理各种通知、请求等事件
      * @author
      */
     public class xWebViewClientent extends WebViewClient {
       @Override
       public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.i("webviewtest", "shouldOverrideUrlLoading: "+url);
        return false;
       }
     }
     /**
      * 当横竖屏切换时会调用该方法
      * @author
      */
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
      Log.i("testwebview", "=====<<< onConfigurationChanged >>>=====");
       super.onConfigurationChanged(newConfig);
       if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        Log.i("webview", " 现在是横屏1");
        islandport = false;
       }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Log.i("webview", " 现在是竖屏1");
        islandport = true;
       }
     }
    }
    View Code

    代码里面我写了好多注释,相信大家都能看得懂,当然本人是菜鸟,可能有些地方理解错了!知道的可以跟我说。然后我在里面加了一个功能,就是点击webview上面按钮切换横竖屏!还有就是当点击全屏播放的时候强制横屏全屏播放,点击返回时回到竖屏!我这里没有用手机重力感应切换横竖屏!代码里面还加了个播放进度的布局文件,大家在源码里可以看到!

    最后说下AndroidManifest.xml设置;

    访问网络权限加上这句:

    <uses-permission android:name="android.permission.INTERNET"/>

    当切换横竖屏时为了不重新调用onCreate等方法,要加个这句:

    android:configChanges="orientation|keyboardHidden|screenSize"

    差不多这样就可以实现全屏播放了,如果有看不懂的问题可以问我,

    完整实例代码代码点击此处本站下载

    希望本文所述对大家Android程序设计有所帮助。

    转自:http://www.jb51.net/article/75110.htm

  • 相关阅读:
    代码实现:输入某年某月某日,判断这一天是这一年的第几天?
    代码实现:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
    代码实现:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元
    代码实现:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    代码实现:一球从100米高度自由落下,每次落地后反跳回原高度的一半; 再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
    代码实现:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.第二个完全数是28, //它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加, //编程找出1000以内的所有完数。
    代码实现:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字
    代码实现:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
    代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5
    代码实现:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
  • 原文地址:https://www.cnblogs.com/kingshow123/p/webview.html
Copyright © 2020-2023  润新知