Android VR 简单开发
2016-11-29 16:55
183 查看
一.配置环境
1.添加模板依赖
common,commonwidget(显示图片和视频都有的库) panowidget专门显示VR图片的依赖库 videwidget专门显示VR视频的依赖库
2.再打开模版的build.gradle添加如下两句话
compile'com.google.android.exoplayer:exoplayer:r1.5.10' compile'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
3.配置ndk用到的c,c++库
把ndk文件夹直接复制到项目中即可
4.配置清单文件,添加如下权限:
<!-- These permissions are used by Google VR SDK to get the best Google VR headset profiles. ! --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
二.java代码操作
展示VR图片
布局文件
使用VrPanoramaView显示图片<!--显示VR图片--> <com.google.vr.sdk.widgets.pano.VrPanoramaView android:id="@+id/pano_view" android:layout_width="match_parent" android:layout_height="250dp" android:layout_margin="5dp" android:scrollbars="@null" />
代码
查找xml中的控件vrPanoramaView = (VrPanoramaView) findViewById(R.id.pano_view);
装载图片
使用loadImageFromBitmap(),该方法建议在UI主线程中调用
本地图片
/** * 本地VR图片展示,图片资源放在assets目录下 */ VrPanoramaView.Options options = new VrPanoramaView.Options(); options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER; try { vrPanoramaView.loadImageFromBitmap(BitmapFactory.decodeStream(getAssets().open("panoramas/andes.jpg")), options); } catch (IOException e) { e.printStackTrace(); }
网络图片
/** * 网络VR图片展示 */ if (backgroundImageLoaderTask!=null){ //取消上一个异步任务 backgroundImageLoaderTask.cancel(true); } backgroundImageLoaderTask = new ImageLoaderTask(); backgroundImageLoaderTask.execute(imgPath);
网络图片下载异步任务
class ImageLoaderTask extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... params) { Bitmap bmp = null; try { URL url = new URL(params[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); if (200 == connection.getResponseCode()) { InputStream is = connection.getInputStream(); bmp = BitmapFactory.decodeStream(is); } } catch (Exception e) { } return bmp; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); VrPanoramaView.Options panoOptions = null; panoOptions = new VrPanoramaView.Options(); panoOptions.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER; vrPanoramaView.loadImageFromBitmap(bitmap, panoOptions); } }
设置事件监听:setEventListener
vrPanoramaView.setEventListener(new VrPanoramaEventListener() { //重写四个方法 }
1.图片资源装载成功
@Override public void onLoadSuccess() { super.onLoadSuccess(); Toast.makeText(VRImgActivity.this, "装载成功", Toast.LENGTH_SHORT).show(); }
2.图片资源装载失败,错误原因如errorMessage
@Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); Toast.makeText(VRImgActivity.this, "装载失败,原因是:" + errorMessage, Toast.LENGTH_SHORT).show(); }
3.VR图片点击执行的方法
@Override public void onClick() { super.onClick(); Toast.makeText(VRImgActivity.this, "点击VR图片", Toast.LENGTH_SHORT).show(); }
4.改变显示模式(全屏模式和纸板模式)
@Override public void onDisplayModeChanged(int newDisplayMode) { super.onDisplayModeChanged(newDisplayMode); Toast.makeText(VRImgActivity.this, "onDisplayModeChanged", Toast.LENGTH_SHORT).show(); }
展示VR视频
布局文件
使用VrVideoView显示视频<com.google.vr.sdk.widgets.video.VrVideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="250dp" android:scrollbars="@null" /> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/video_view" android:layout_marginBottom="10dp" android:layout_marginRight="20dp" />
代码
查找xml中的控件videoWidgetView = (VrVideoView) findViewById(R.id.video_view); seekBar = (SeekBar) findViewById(R.id.seekBar);
装载视频
本地(loadVideoFromAsset)和网络(loadVideo)
VrVideoView.Options options = new VrVideoView.Options(); options.inputType = VrVideoView.Options.TYPE_STEREO_OVER_UNDER; try { //本地视频 // videoWidgetView.loadVideoFromAsset("videos/congo.mp4", options); //网络视频 videoWidgetView.loadVideo(Uri.parse(videoPath), options); } catch (IOException e) { e.printStackTrace(); }
使用Seekbar进度条控制视频进度
设置其监听重写方法
@Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { videoWidgetView.seekTo(progress); } }
设置事件监听:setEventListener
vrPanoramaView.setEventListener(new VrPanoramaEventListener() { //重写五个方法 }
1.视频资源装载成功,设置seekBar
@Override public void onLoadSuccess() { super.onLoadSuccess(); seekBar.setMax((int) videoWidgetView.getDuration()); }
2.图片资源装载失败,错误原因如errorMessage
@Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); Toast.makeText(VRVideoActivity.this, "装载失败,原因是:" + errorMessage, Toast.LENGTH_SHORT).show(); }
3.VR视频点击执行的方法
@Override public void onClick() { super.onClick(); togglePause(); }
togglePause(),具体如下:暂停就播放,播放可暂停
private void togglePause() { if (isPaused) { videoWidgetView.playVideo(); } else { videoWidgetView.pauseVideo(); } isPaused = !isPaused; }
4.更新SeeKBar的进度条
@Override public void onNewFrame() { super.onNewFrame(); seekBar.setProgress((int) videoWidgetView.getCurrentPosition()); }
5.视频完成播放再次循环播放
@Override public void onCompletion() { videoWidgetView.seekTo(0); }
视频伴随生命周期的操作
防止渲染
@Override protected void onPause() { super.onPause(); videoWidgetView.pauseRendering(); isPaused = true; }
恢复渲染
@Override protected void onResume() { super.onResume(); videoWidgetView.resumeRendering(); }
销毁
@Override protected void onDestroy() { //一定要在onDestroy()时调用,用来释放占用内存 videoWidgetView.shutdown(); super.onDestroy(); }
到这里结束了,此文主要是简单集成VR,欢迎大家学习补充.
代码资源下载
相关文章推荐
- Eclipse下Android开发环境的搭建及简单应用的创建
- android移动开发简单的开发实例
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发之一】设置全屏以及绘画简单的图形
- 【Android游戏开发之一】设置全屏以及绘画简单的图形
- 简单介绍如何应用DDMS协助开发Android Apps
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- 16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能
- android开发,以记住用户登录密码为例说明SharedPreferences的简单应用
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- Android简单应用的开发
- 【Android2D游戏开发十六】(上文之触摸屏手势)详解Android Gesture 手势操作!利用手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发之一】设置全屏以及绘画简单的图形
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- android开发专题系列-一个简单的游戏的设计
- 【Android游戏开发之一】设置全屏以及绘画简单的图形
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- android OpenGLES开发第一课 绘制简单的Polygon
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!