Android VR 简单开发

一.配置环境

1.添加模板依赖

common,commonwidget(显示图片和视频都有的库)
panowidget专门显示VR图片的依赖库
videwidget专门显示VR视频的依赖库

2.再打开模版的build.gradle添加如下两句话

compile'com.google.android.exoplayer:exoplayer:r1.5.10'
compile'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'

3.配置ndk用到的c,c++库

把ndk文件夹直接复制到项目中即可

4.配置清单文件,添加如下权限:

<!-- These permissions are used by Google VR SDK to get the best Google VR headset profiles. ! -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

二.java代码操作

展示VR图片

布局文件

  • 使用VrPanoramaView显示图片

    <!--显示VR图片-->
    <com.google.vr.sdk.widgets.pano.VrPanoramaView
        android:id="@+id/pano_view"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:layout_margin="5dp"
        android:scrollbars="@null" />
    

代码

  • 查找xml中的控件

    vrPanoramaView = (VrPanoramaView) findViewById(R.id.pano_view);
    

  • 装载图片

    使用loadImageFromBitmap(),该方法建议在UI主线程中调用

    • 本地图片

      /**
       * 本地VR图片展示,图片资源放在assets目录下
       */
      VrPanoramaView.Options options = new VrPanoramaView.Options();
      options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
      try {
          vrPanoramaView.loadImageFromBitmap(BitmapFactory.decodeStream(getAssets().open("panoramas/andes.jpg")), options);
      } catch (IOException e) {
          e.printStackTrace();
      }
      
    • 网络图片

      /**
       * 网络VR图片展示
       */
      if (backgroundImageLoaderTask!=null){
          //取消上一个异步任务
          backgroundImageLoaderTask.cancel(true);
      }
      backgroundImageLoaderTask = new ImageLoaderTask();
      backgroundImageLoaderTask.execute(imgPath);
      

      网络图片下载异步任务

      class ImageLoaderTask extends AsyncTask<String, Void, Bitmap> {
          @Override
          protected Bitmap doInBackground(String... params) {
              Bitmap bmp = null;
              try {
                  URL url = new URL(params[0]);
                  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                  connection.setRequestMethod("GET");
                  connection.setConnectTimeout(5000);
                  if (200 == connection.getResponseCode()) {
                      InputStream is = connection.getInputStream();
                      bmp = BitmapFactory.decodeStream(is);
                  }
      
              } catch (Exception e) {
      
              }
              return bmp;
          }
      
          @Override
          protected void onPostExecute(Bitmap bitmap) {
              super.onPostExecute(bitmap);
              VrPanoramaView.Options panoOptions = null;
              panoOptions = new VrPanoramaView.Options();
              panoOptions.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
              vrPanoramaView.loadImageFromBitmap(bitmap, panoOptions);
          }
      }
      

  • 设置事件监听:setEventListener

    vrPanoramaView.setEventListener(new VrPanoramaEventListener() {
        //重写四个方法
    }
    

    1.图片资源装载成功

    @Override
    public void onLoadSuccess() {
        super.onLoadSuccess();
        Toast.makeText(VRImgActivity.this, "装载成功", Toast.LENGTH_SHORT).show();
    }
    

    2.图片资源装载失败,错误原因如errorMessage

    @Override
    public void onLoadError(String errorMessage) {
        super.onLoadError(errorMessage);
        Toast.makeText(VRImgActivity.this, "装载失败,原因是:" + errorMessage, Toast.LENGTH_SHORT).show();
    }
    

    3.VR图片点击执行的方法

    @Override
    public void onClick() {
        super.onClick();
        Toast.makeText(VRImgActivity.this, "点击VR图片", Toast.LENGTH_SHORT).show();
    }
    

    4.改变显示模式(全屏模式和纸板模式)

    @Override
    public void onDisplayModeChanged(int newDisplayMode) {
        super.onDisplayModeChanged(newDisplayMode);
        Toast.makeText(VRImgActivity.this, "onDisplayModeChanged", Toast.LENGTH_SHORT).show();
    }
    

展示VR视频

布局文件

  • 使用VrVideoView显示视频

    <com.google.vr.sdk.widgets.video.VrVideoView
    android:id="@+id/video_view"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:scrollbars="@null" />
    
    <SeekBar
    android:id="@+id/seekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/video_view"
    android:layout_marginBottom="10dp"
    android:layout_marginRight="20dp" />
    

代码

  • 查找xml中的控件

    videoWidgetView = (VrVideoView) findViewById(R.id.video_view);
    seekBar = (SeekBar) findViewById(R.id.seekBar);
    

  • 装载视频

    本地(loadVideoFromAsset)和网络(loadVideo)

    VrVideoView.Options options = new VrVideoView.Options();
    options.inputType = VrVideoView.Options.TYPE_STEREO_OVER_UNDER;
    try {
        //本地视频
    //  videoWidgetView.loadVideoFromAsset("videos/congo.mp4", options);
        //网络视频
        videoWidgetView.loadVideo(Uri.parse(videoPath), options);
    } catch (IOException e) {
        e.printStackTrace();
    }
    

  • 使用Seekbar进度条控制视频进度

    设置其监听重写方法

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            videoWidgetView.seekTo(progress);
        }
    }
    

  • 设置事件监听:setEventListener

    vrPanoramaView.setEventListener(new VrPanoramaEventListener() {
        //重写五个方法
    }
    

    1.视频资源装载成功,设置seekBar

    @Override
    public void onLoadSuccess() {
        super.onLoadSuccess();
        seekBar.setMax((int) videoWidgetView.getDuration());
    }
    

    2.图片资源装载失败,错误原因如errorMessage

    @Override
    public void onLoadError(String errorMessage) {
        super.onLoadError(errorMessage);
        Toast.makeText(VRVideoActivity.this, "装载失败,原因是:" + errorMessage, Toast.LENGTH_SHORT).show();
    }
    

    3.VR视频点击执行的方法

    @Override
    public void onClick() {
        super.onClick();
        togglePause();
    }
    
    • togglePause(),具体如下:暂停就播放,播放可暂停

      private void togglePause() {
          if (isPaused) {
              videoWidgetView.playVideo();
          } else {
              videoWidgetView.pauseVideo();
              }
          isPaused = !isPaused;
      }
      

    4.更新SeeKBar的进度条

    @Override
    public void onNewFrame() {
        super.onNewFrame();
        seekBar.setProgress((int) videoWidgetView.getCurrentPosition());
    }
    

    5.视频完成播放再次循环播放

    @Override
    public void onCompletion() {
        videoWidgetView.seekTo(0);
    }
    

  • 视频伴随生命周期的操作

    防止渲染

    @Override
    protected void onPause() {
        super.onPause();
        videoWidgetView.pauseRendering();
        isPaused = true;
    }
    

    恢复渲染

    @Override
    protected void onResume() {
        super.onResume();
        videoWidgetView.resumeRendering();
    }
    

    销毁

    @Override
    protected void onDestroy() {
        //一定要在onDestroy()时调用,用来释放占用内存
        videoWidgetView.shutdown();
        super.onDestroy();
    }
    

到这里结束了,此文主要是简单集成VR,欢迎大家学习补充.

代码资源下载

猜你喜欢

转载自blog.csdn.net/qq_35733332/article/details/53395294
VR
今日推荐