您的位置:首页 > 移动开发 > Android开发

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,欢迎大家学习补充.

代码资源下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android VR 图片 视频
相关文章推荐