Android VR的使用

    xiaoxiao2021-03-25  151

    0.0 在项目里新建一个资产目录assets,把图片放入资产目录下

    1.0 在清单文件中添加: android:largeHeap="true"

    因为使用VR的资源消耗内存,所以我们为了避免OOM的问题,要把警报权提高,从192到512M(兆) ;

    2.0 导入moudle并且关联 common commonwidget panowidget(基本库文件 基本视图库文件 全景图库文件)

    查找方法:Android官方提供的demo里面点击libraries即可

    关联依赖库的方法: ,依次导入我们要关联的依赖库common,commonwidget,panowidget

    shift+Ctrl+alt+s:进入下面控制界面

    3.0 在Module的build.gradle文件里dependencies,添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'

    A. B. c.

         用记事本打开build.gradle可以了:

        

    4.0 完成项目XML布局,VrPanoramaView

    <com.google.vr.sdk.widgets.pano.VrPanoramaView android:id="@+id/vr_view" android:layout_width="match_parent" android:layout_height="match_parent"> </com.google.vr.sdk.widgets.pano.VrPanoramaView>

    5.0 由于VR资源数据量大,获取需要时间,故把加载图片放到子线程中进行,主线程来显示图片,可以使用一个异步线程AsyncTask或EventBus技术完成

    private class ImageLoaderTesk extends AsyncTask<Void,Void,Bitmap>{//以后EventBus去替代 //B 该方法在子线程中运行,从本地文件中把资源加载内存中 @Override protected Bitmap doInBackground(Void... params) { //从资产目录拿到资源,返回结果是字节流 try { InputStream inputStream=getAssets().open("andes.jpg"); //把字节流转换成为BitMap对象 Bitmap bitmap= BitmapFactory.decodeStream(inputStream); return bitmap; } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Bitmap bitmap) { //创建VrpanoramaView.Options,去决定VR是普通效果还是立体效果 VrPanoramaView.Options options=new VrPanoramaView.Options(); //TYPE_STERED_OVER_UNDER立体效果:图片的上半部分在左眼显示,下半部分在右眼显示 TYPE_MONO:普通效果 options.inputType=VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER; //使用vr控件对象,显示对象 参数1: Bitmap对象 2. VrpanoramaView.Options对象,决定显示效果 mVrPanoramaView.loadImageFromBitmap(bitmap,options); super.onPostExecute(bitmap); } } 更新UI界面之后,我们就要播放VR效果了:

    mImageLoaderTesk = new ImageLoaderTesk(); mImageLoaderTesk.execute();

    6.0 因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResume状态,继续VR视图显示,进入onDestroy状态,杀死VR,关闭异步任务

    // 当失去焦点时,回调 @Override protected void onPause() { // 暂停渲染和显示 mVrPanoramaView.pauseRendering(); super.onPause(); } //当重新获取焦点时,回调 @Override protected void onResume() { super.onResume(); //继续渲染和显示 mVrPanoramaView.resumeRendering(); } //当activity销毁时,回调 @Override protected void onDestroy() { //关闭渲染视图 mVrPanoramaView.shutdown(); if (mImageLoaderTesk != null){ //在退出activity时,如果异步任务没有取消,就取消!! if (!mImageLoaderTesk.isCancelled()){ mImageLoaderTesk.cancel(true); } } super.onDestroy(); }

    7.0 设置对VR运行状态的监听,如果VR运行出现错误,可以及时的处理.  

    //D 设置对VR运行状态的监听,如果VR运行出现差错,可以及时处理 mVrPanoramaView.setEventListener(new MyVREventListener()); // VR 运行状态监听类,自定义一个类 private class MyVREventListener extends VrPanoramaEventListener{ //当VR视图加载成功的时候回调 @Override public void onLoadSuccess() { super.onLoadSuccess(); Toast.makeText(MainActivity.this, "加载成功", Toast.LENGTH_SHORT).show(); } //加载失败的时候,回调! @Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); Toast.makeText(MainActivity.this,"加载失败",Toast.LENGTH_SHORT).show(); } }

    8.0 播放VR效果,只需执行异步任务即可.

    //C 使用自定义的AsyncTask,播放VR效果 mImageLoaderTesk = new ImageLoaderTesk(); mImageLoaderTesk.execute(); 9.0 特殊效果:

    //隐藏掉VR效果坐下角的信息按钮显示 mVrPanoramaView.setInfoButtonEnabled(false); //隐藏VR效果右下角 全屏显示的按钮 mVrPanoramaView.setFullscreenButtonEnabled(false); //切换VR的模式 参数VrPanoramaView.DisplayMode.FULLSCREEN_STEREO设备模式(手机横着放) VrPanoramaView.DisplayMode.FULLSCREEN_MODO;手机模式 mVrPanoramaView.setDisplayMode(VrPanoramaView.DisplayMode.FULLSCREEN_STEREO);

    效果图如下:

    转载请注明原文地址: https://ju.6miu.com/read-2702.html

    最新回复(0)