当前位置:   article > 正文

Android中VR全景图项目配置环境和具体项目Demo_vr demo

vr demo
VR作用:增强虚拟现实

VR:virtual reality(虚拟实境)


使用VR组件时,项目需要最低SDK版本为19。

在main下新建文件夹为assets,用于存放资源文件



一、配置VR开发环境步骤:


1.使用VR是非常消耗内存的,所以为了避免OOM的问题,需在清单文件中application下添加的属性(把警报权限提高,从192提高到512MB)。(Heap:堆)
android:largeHeap="true"


2.在build.gradle里添加最新的依赖文件,下面的三个是后面依赖module产生的。

gradle文件参照sample下的demo来修改



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



3.在项目中导入我们所需要的依赖的module,分别是:common、commonwidget、panowidget。



4.依赖module到我们的项目中



5.测试我们配置是否成功

 


二、基本VR创建步骤与使用的具体代码


步骤如下:

        0.0 在项目里新建一个资产目录assets,把图片放入资产目录下,
        1.0 在清单文件下Application节点中加入android:largeHeap="true"的属下节点.
        2.0 导入VR需要依赖的library库,以导model的方式去导入:Common,Commonwidge,Panowidget
        3.0 在Module的build.gradle文件里dependencies,添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
        4.0 完成项目XML布局,VrPanoramaView
        5.0 由于VR资源数据量大,获取需要时间,故把加载图片放到子线程中进行,主线程来显示图片,可以使用一个异步线程AsyncTask或EventBus技术完成
        6.0 因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResume状态,继续VR视图显示,进入onDestroy状态,杀死VR,关闭异步任务
        7.0 设置对VR运行状态的监听,如果VR运行出现错误,可以及时的处理.
        8.0 播放VR效果,只需执行异步任务即可.


代码如下:

MainActivity.java

  1. package com.zhiyuan3g.vr;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.os.AsyncTask;
  5. import android.os.Bundle;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.widget.Toast;
  8. import com.google.vr.sdk.widgets.common.VrWidgetView;
  9. import com.google.vr.sdk.widgets.pano.VrPanoramaEventListener;
  10. import com.google.vr.sdk.widgets.pano.VrPanoramaView;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. //导入三个库文件:common、commonwidget、panowidget
  14. public class MainActivity extends AppCompatActivity {
  15. private VrPanoramaView vp_view;
  16. private ImageLoderTask mImageLoderTask;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. initView();
  22. }
  23. private void initView() {
  24. //A.实例化控件
  25. vp_view = (VrPanoramaView) findViewById(R.id.vp_view);
  26. //C.使用自定义的AsyncTask,播放VR效果
  27. mImageLoderTask = new ImageLoderTask();
  28. mImageLoderTask.execute();
  29. //隐藏掉VR左下角的信息按钮显示
  30. vp_view.setInfoButtonEnabled(false);
  31. //隐藏VR右下角全屏显示的按钮显示
  32. vp_view.setFullscreenButtonEnabled(false);
  33. //切换VR的模式 参数:VrWidgetView.DisplayMode.FULLSCREEN_STEREO ->设备模式(横屏,会出现两个眼球视图)
  34. //参数:VrWidgetView.DisplayMode.FULLSCREEN_MONO:正常模式(竖屏)
  35. vp_view.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
  36. //设置对VR运行状态的监听,如果VR运行出现错误,可以及时处理
  37. vp_view.setEventListener(new MyVREventListener());
  38. }
  39. //因为读取VR资源是耗时操作(资源大,耗费大量时间),所以我们不能再主线程去做读取,
  40. //但是只有主线程能更新UI,所有我们使用AsyncTask
  41. private class ImageLoderTask extends AsyncTask<Void, Void, Bitmap> {//以后用EventBus替代
  42. //B.该方法在子线程运行,从本地文件中把资源加载到内存中
  43. @Override
  44. protected Bitmap doInBackground(Void... params) {
  45. try {
  46. //从资源目录中拿到资源,返回结果是字节流
  47. InputStream inputStream = getAssets().open("andes.jpg");
  48. //把字节流转换成Bitmap对象
  49. Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
  50. return bitmap;
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. return null;
  55. }
  56. @Override
  57. protected void onPostExecute(Bitmap bitmap) {
  58. //创建VrPanoramaView.Options,去决定显示VR时普通效果,还是立体效果
  59. VrPanoramaView.Options options = new VrPanoramaView.Options();
  60. //TYPE_STEREO_OVER_UNDER立体效果:图片上半部分放在左眼显示,下半部放在右眼显示 TYPE_MONO:普通效果
  61. options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
  62. //使用VR控件对象,显示效果,参数1:Bitmap对象 2:vrPanoramaView.Options对象,决定显示效果
  63. vp_view.loadImageFromBitmap(bitmap,options);
  64. super.onPostExecute(bitmap);
  65. }
  66. }
  67. //因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResume状态,继续VR视图的显示,
  68. //进入onDestroy,杀死VR,关闭异步任务
  69. //当失去焦点时,回调
  70. @Override
  71. protected void onPause() {
  72. //暂停渲染和显示
  73. vp_view.pauseRendering();
  74. super.onPause();
  75. }
  76. //当重新获取到焦点时,回调
  77. @Override
  78. protected void onResume() {
  79. super.onResume();
  80. //继续渲染和显示
  81. vp_view.resumeRendering();
  82. }
  83. //当Activity销毁时,回调
  84. @Override
  85. protected void onDestroy() {
  86. //关闭渲染视图
  87. vp_view.shutdown();
  88. if (mImageLoderTask != null) {
  89. //在退出Activity时,如果异步任务没有取消,就取消
  90. if (!mImageLoderTask.isCancelled()) {
  91. mImageLoderTask.cancel(true);
  92. }
  93. }
  94. super.onDestroy();
  95. }
  96. //VR运行状态监听类
  97. private class MyVREventListener extends VrPanoramaEventListener {
  98. //当VR视图加载成功的时候,回调
  99. @Override
  100. public void onLoadSuccess() {
  101. super.onLoadSuccess();
  102. Toast.makeText(getApplicationContext(), "加载成功!!", Toast.LENGTH_SHORT).show();
  103. }
  104. //当VR视图加载失败的时候,回调
  105. @Override
  106. public void onLoadError(String errorMessage) {
  107. super.onLoadError(errorMessage);
  108. Toast.makeText(getApplicationContext(), "加载失败!!!", Toast.LENGTH_SHORT).show();
  109. }
  110. }
  111. }

效果图:




VR的项目及Demo资源下载:点击打开链接


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/530911
推荐阅读
相关标签
  

闽ICP备14008679号