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

1.0 搭建VR开发环境,添加资源,修改Gradle,清单文件等

在main 文件下新建一个asstes 文件夹,中存放VR全景图

代码虚拟化运行 虚拟现实代码_代码虚拟化运行


因为使用VR的资源很消耗内存,为了避免OOM(OutOfMemory)的问题,要把警报权限提高,从192提到512

故 要在清单文件下加一段下列代码:

android:largeHeap="true"

代码虚拟化运行 虚拟现实代码_虚拟现实_02


修改Gradle文件:该项目中做的是全景图,故在全景图的文件中修改相对应的grandle文件

代码虚拟化运行 虚拟现实代码_代码虚拟化运行_03


在自己的项目中grandle文件中添加:下面一段代码

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

导入库文件:目的是使用VR里的方法和控件

选择你需要的库文件,不要都导进去,否则会导致APK的容量过大;

复制其路径,以moudle的形式导进项目中 如下:

代码虚拟化运行 虚拟现实代码_三维_04


注意此项目的API版本为19 如不是则修改成19或19以上 如下

代码虚拟化运行 虚拟现实代码_技术_05

关联库文件 shift+ctrl+alt+s

代码虚拟化运行 虚拟现实代码_代码虚拟化运行_06

三个全选中:

代码虚拟化运行 虚拟现实代码_代码虚拟化运行_07

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

代码虚拟化运行 虚拟现实代码_三维_08

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();
          }

      }
}

程序运行效果图:

代码虚拟化运行 虚拟现实代码_技术_09