virtual reality(虚拟现实)

来源:互联网 发布:php curl 断点续传 编辑:程序博客网 时间:2024/05/13 03:38

概念:虚拟实境(英语:virtual reality,缩写为VR),简称虚拟技术 , 是利用电脑模拟产生一个三维空间的虚拟世界,提供用户关于视觉等感官的模拟,让用户感觉仿佛身历其境,可以及时、没有限制地观察三维空间内的事物。
功能:增加虚拟现实

1.0 搭建VR开发环境,添加资源,修改Gradle,清单文件等
在main 文件下新建一个asstes 文件夹,中存放VR全景图
这里写图片描述
因为使用VR的资源很消耗内存,为了避免OOM(OutOfMemory)的问题,要把警报权限提高,从192提到512
故 要在清单文件下加一段下列代码:

android:largeHeap="true"

这里写图片描述
修改Gradle文件:该项目中做的是全景图,故在全景图的文件中修改相对应的grandle文件
这里写图片描述
在自己的项目中grandle文件中添加:下面一段代码

compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'

导入库文件:目的是使用VR里的方法和控件
选择你需要的库文件,不要都导进去,否则会导致APK的容量过大;
复制其路径,以moudle的形式导进项目中 如下:
这里写图片描述
注意此项目的API版本为19 如不是则修改成19或19以上 如下
这里写图片描述

关联库文件 shift+ctrl+alt+s
这里写图片描述

三个全选中:

这里写图片描述

验证 库文件是否导入成功:出现如下,就成功了

这里写图片描述

2.0 完成项目XML布局

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

3.0在MainActivity中添加主要代码

public class MainActivity extends AppCompatActivity {    private VrPanoramaView vrPanoramaView;    private ImagerLoaderTask imagerLoaderTask;    //导入三个文件库,common(基本库文件) commonwidget(基本的控件文件) panowidget(全景图 自己可选择)    // 直接把文件的路径复制进去    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 1 控件初始化        vrPanoramaView = (VrPanoramaView) findViewById(R.id.vrp_view);// ctrl +alt+f 自动生成成员变量        // 隐藏掉VR效果左下角的信息按钮显示        vrPanoramaView.setInfoButtonEnabled(false);        // 隐藏掉VR效果右下角的全屏显示效果        vrPanoramaView.setFullscreenButtonEnabled(false);        //切换VR的模式 参数 VrPanoramaView.DisplayMode.FULLSCREEN_MONO设备模式(横着放)        vrPanoramaView.setDisplayMode(VrPanoramaView.DisplayMode.FULLSCREEN_STEREO);        // 使用自定义运行状态的监听,播放VR效果        vrPanoramaView.setEventListener(new MyVREentListener());        //使用自定义的AsyncTask,播放VR效果        imagerLoaderTask = new ImagerLoaderTask();        imagerLoaderTask.execute();    }    //因为读取VR的资源是一个耗时操作(VR的资源非常大,读取需要时间),所以我们不能够在主线程去读取,但是只有在主线程才能做UI的更新,故我们使用    //AsyTask    private  class ImagerLoaderTask extends AsyncTask<Void,Void,Bitmap>{//以后用EvebtBus去代替        //2.该方法在子线程运行,从本地文件把资源加载到内存中        @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;        }  //用来接收 doInBackground方法返回的bitmap        @Override        protected void onPostExecute(Bitmap bitmap) {            //创建VrPanoramaView.Options,去决定显示VR是普通效果,还是立体效果            VrPanoramaView.Options options = new VrPanoramaView.Options();//ctrl+alt+v 自动生成对象的类名            //TYPE_STEREO_OVER_UNDER立体效果:图片的上半部分是在左眼显示,下半部分是在右眼显示,TYPE_MONO:普通效果            options.inputType=VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;            //使用VR控件对象,显示效果,  参数:1,Bitmap对象  2.VrPPanoramaView.OPtions对象,决定显示的效果            vrPanoramaView.loadImageFromBitmap(bitmap,options);            super.onPostExecute(bitmap);        }    }    //进行VR视图的优化       // 因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResum状态,继续VR视图显示,进入onDestroy,杀死VR,关闭异步任务    // 当失去焦点是回调    @Override    protected void onPause() {        //暂停渲染和显示  随着屏幕的暂停,也要暂停VR视图        vrPanoramaView.pauseRendering();        super.onPause();    }//当重新获取焦点时,回调    @Override    protected void onResume() {        super.onResume();        //继续渲染和显示        vrPanoramaView.resumeRendering();    }  //当activity 销毁时回调    @Override    protected void onDestroy() {        //关闭渲染视图        vrPanoramaView.shutdown();        if(imagerLoaderTask !=null){            if(!imagerLoaderTask.isCancelled()){                //在退出activity时,如果异步任务没有取消,就取消                imagerLoaderTask.cancel(true);            }        }        super.onDestroy();    }    // VR运行状态监听类,自定义一个类继承      private class MyVREentListener extends VrPanoramaEventListener{        //当VR视图加载成功时回调          public void onLoadSuccess(){              super.onLoadSuccess();              Toast.makeText(MainActivity.this,"加载成功",Toast.LENGTH_SHORT).show();          }        //当VR视图加载失败时回调          public void onLoadError(String errorMessage){              super.onLoadError(errorMessage);              Toast.makeText(MainActivity.this,"加载失败",Toast.LENGTH_SHORT).show();          }      }}

程序运行效果图:
这里写图片描述

1 0
原创粉丝点击