virtual reality(虚拟现实)

    xiaoxiao2021-03-25  437

    概念:虚拟实境(英语: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(); } } }

    程序运行效果图:

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

    最新回复(0)