VR技术—简单的实现

简单实现VR效果
1.在我们项目中创建一个assets包,用来放我们的资源文件
2.在清单文件下的Application节点中加入Android:LargeHeap = "true"节点,设值为true
     一般情况下不设置这个节点会出现bug,内存警报线一般在192m 设置true后会增加为512m。
3.然后倒入我们所下载好的VR依赖库,以导model的方式导入
4.这样还会出错,我们还需要在build文件里 dependencies,
    添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
不添加会报错,我们想要处理的模式将会报出异常,
//在onResume中重新获取焦点
@Override
protected void onResume() {
    //重新获取焦点,并渲染显示
    super.onResume();
    //这行报错
    vrPanoramaView.resumeRendering();
}
这里也会报错
 
  
//这行报错
vrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
这里也会报出异常,就是这两个地方是不能被执行的!
-----------------------------------------------------------------------------------------------
直接上代码看吧!
/**
 * 1.在项目开始时创建一个assets包用来放我们所需要的资源文件
 * 2.在清单文件下的Application节点中加入android:largeHeap="true"节点,设置为true
 *    内存警报线一般在192m 设置后会增加到512m
 * 3.导入VR所需要的依赖库,以导model的方式导入
 * 4.这样还有错误,我们还需要在build文件里dependencies,添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
 *      如果不添加将会导致项目崩溃,报出异常;
 *  5.在项目XML中布局VrPanoramaView
 * 6.由于VR文件较大,所以需要开启一个线程或者利用异步加载
 * 7.由于VR很占用内存,所以需要给VR设置暂停  继续  和销毁的状态
 * 8.设置对VR运行状态的监听,如果VR运行出现错误,可以及时的处理.
 * 9.播放VR效果,只需执行异步任务即可.
 * @param savedInstanceState
 */
 
  
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //初始化View
    //对VR控件进行初始化
    vrPanoramaView = (VrPanoramaView) findViewById(R.id.vrPanoramaView);
    //因按钮跳转到的是Google网站,不易加载,所以隐藏掉VR效果左下角的信息按钮显示
    vrPanoramaView.setInfoButtonEnabled(false);
    //因不需要全屏,所以隐藏了它
    vrPanoramaView.setFullscreenButtonEnabled(false);
    //切换VR的模式   参数: VrWidgetView.DisplayMode.FULLSCREEN_STEREO设备模式(手机横着放试试)
    //   VrWidgetView.DisplayMode.FULLSCREEN_MONO手机模式
    //这行报错
    vrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
    //设置对VR运行状态的监听,如果VR运行出现错误,可以及时处理.
    vrPanoramaView.setEventListener(new MyVREventListener());
    //使用自定义的AsyncTask,播放VR效果
    imageLoaderTask = new ImageLoaderTask();
    imageLoaderTask.execute();
}
/**
 * B.自定义一个类继承AsyncTask,只使用我们需要的方法.
 * 由于VR资源数据量大,获取需要时间,故把加载图片放到子线程中进行,主线程来显示图片,故可以使用一个异步线程AsyncTask或EventBus来处理.
 */
private class ImageLoaderTask extends AsyncTask<Void, Void , Bitmap>{
    //这个方法在子线程中,把我们本地的资源文件加载到内存中
    @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) {
        //创建bVrPanoramaView.Options,去决定显示VR是普通效果,还是立体效果
        VrPanoramaView.Options options = new VrPanoramaView.Options();
        //TYPE_STEREO_OVER_UNDER立体效果:图片的上半部分放在左眼显示,下半部分放在右眼显示     TYPE_MONO:普通效果
        options.inputType=VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
        //使用VR控件对象,显示效果  参数:1.Bitmap对象      2.VrPanoramaView.Options对象,决定显示的效果
        vrPanoramaView.loadImageFromBitmap(bitmap, options);
        super.onPostExecute(bitmap);
    }
}
//在onPause中暂停VR,失去焦点
@Override
protected void onPause() {
    vrPanoramaView.pauseRendering();
    super.onPause();
}
//在onResume中重新获取焦点
@Override
protected void onResume() {
    //重新获取焦点,并渲染显示
    super.onResume();
    //这行报错
    vrPanoramaView.resumeRendering();
}
//销毁Activity,销毁VR
@Override
protected void onDestroy() {
    super.onDestroy();
    //关闭渲染视图
    vrPanoramaView.shutdown();
    if(imageLoaderTask!=null){
        //在退出Activity时,如果异步任务没有取消的话,咱就取消下
        if(!imageLoaderTask.isCancelled()){
            //取消异步任务
            imageLoaderTask.cancel(true);
        }
    }
}
//VR运行状态监听类,自定义一个类继承VrPanoramaEventListener,复写里面的两个方法
private class MyVREventListener extends VrPanoramaEventListener {
    //当VR视图加载成功的时候回调
    @Override
    public void onLoadSuccess() {
        super.onLoadSuccess();
        Toast.makeText(MainActivity.this, "加载成功", Toast.LENGTH_SHORT).show();
    }
    //当VR视图加载失败的时候回调
    @Override
    public void onLoadError(String errorMessage) {
        super.onLoadError(errorMessage);
        Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
    }
}

猜你喜欢

转载自blog.csdn.net/mr_tianchen/article/details/69886802