VR全景图片流程
1.在项目里新建一个资产目录assets(这个文件夹下存放原生的资源文件,在打包生成apk的时候不会被编译),把图片放入资产目录下
在清单文件下Application节点中加入android:largeHeap="true"的属下节点.内存异常OOM警报会提升为512m(普通为192m),处理了加载全景图易造成的OOM的问题.
Dalvik vm heapsize =512m(最大内存限制) Dalvik vm heapsize =192m(普通内存限制)
注意:因为VR所需的图片资源,占用内存非常大,所以开发VR要时刻注意内存溢出的问题.
3.导入VR需要依赖的library库,以导model的方式去导入(从官方给出的demo的libraries可以找到),以下三个是必须导入的,最后进行依赖
Common:VR基本库
Commonwidget:VR视图控件处理的API
Panowidget:Code for the VR view Panorama Widget(虚拟现实全景视图控件的代码)
导入依赖:4.在Module的build.gradle文件里dependencies,添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
如果不添加会报这个错误: FATAL EXCRPTTON:main process: com.itheima.vrpanodemo,PID:13007 java.lang.NoClassDeFoundError:com.goole.vrtoolkit.
开发VR全景图的具体代码:
1.在要显示VR效果的XML布局文件中,添加VR控件,并在java代码中找到VrPanoramaView控件对象
由于VR资源数据量大,获取需要时间,故把加载图片放到子线程中进行,主线程来显示图片,可以使用一个异步线程AsyncTask或EventBus技术完成.
3.因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResume状态,继续VR视图显示,进入onDestroy状态,杀死VR,关闭异步任务
4.设置对VR运行状态的监听,如果VR运行出现错误,可以及时的处理.
1.在项目里新建一个资产目录assets(这个文件夹下存放原生的资源文件,在打包生成apk的时候不会被编译),把图片放入资产目录下
在清单文件下Application节点中加入android:largeHeap="true"的属下节点.内存异常OOM警报会提升为512m(普通为192m),处理了加载全景图易造成的OOM的问题.
Dalvik vm heapsize =512m(最大内存限制) Dalvik vm heapsize =192m(普通内存限制)
注意:因为VR所需的图片资源,占用内存非常大,所以开发VR要时刻注意内存溢出的问题.
3.导入VR需要依赖的library库,以导model的方式去导入(从官方给出的demo的libraries可以找到),以下三个是必须导入的,最后进行依赖
Common:VR基本库
Commonwidget:VR视图控件处理的API
Panowidget:Code for the VR view Panorama Widget(虚拟现实全景视图控件的代码)
导入依赖:4.在Module的build.gradle文件里dependencies,添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
如果不添加会报这个错误: FATAL EXCRPTTON:main process: com.itheima.vrpanodemo,PID:13007 java.lang.NoClassDeFoundError:com.goole.vrtoolkit.
开发VR全景图的具体代码:
1.在要显示VR效果的XML布局文件中,添加VR控件,并在java代码中找到VrPanoramaView控件对象
由于VR资源数据量大,获取需要时间,故把加载图片放到子线程中进行,主线程来显示图片,可以使用一个异步线程AsyncTask或EventBus技术完成.
3.因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResume状态,继续VR视图显示,进入onDestroy状态,杀死VR,关闭异步任务
4.设置对VR运行状态的监听,如果VR运行出现错误,可以及时的处理.
5.播放VR效果,只需执行异步任务即可.
/
VR简单视频播放的流程
第一步:我们导入依赖:compile 'com.google.vr:sdk-videowidget:1.10.0'
二.注意支持的最小SDK
minSdkVersion 19
targetSdkVersion 25
直接在布局xml里面引用即可
直接在工程里面调用
以上是实现流程下面是代码实现:
public class VRActivity extends AppCompatActivity { /** * 播放360度全景视频的的控件 */ private VrVideoView vr_video_view; /** * 拖动进度的进度条 */ private SeekBar seek_bar; /** * 声音开关 */ private ImageButton volume_toggle; /** * 播放按钮 */ private ImageButton play_toggle; /** * 声音是否开启 */ private boolean isMuted; /** * 播放暂停 */ private boolean isPlay=true; /** * 打印调试的TAG */ private final String TAG = "VrVideoView"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_vr); load360Video(); } /** * 加载360度全景视频 */ private void load360Video() { vr_video_view = (VrVideoView) findViewById(R.id.vr_video_view); seek_bar = (SeekBar) findViewById(R.id.seek_bar); volume_toggle = (ImageButton) findViewById(R.id.volume_toggle); play_toggle = (ImageButton) findViewById(R.id.play_toggle); /**设置加载设置**/ VrVideoView.Options options = new VrVideoView.Options(); options.inputType = VrVideoView.Options.TYPE_STEREO_OVER_UNDER; /** * 设置加载监听 */ vr_video_view.setEventListener(new VrVideoEventListener() { /** * 视频播放完成回调 */ @Override public void onCompletion() { super.onCompletion(); /**播放完成后跳转到开始重新播放**/ vr_video_view.seekTo(0); setIsPlay(false); Log.d(TAG, "onCompletion()"); } /** * 加载每一帧视频的回调 */ @Override public void onNewFrame() { super.onNewFrame(); seek_bar.setProgress((int) vr_video_view.getCurrentPosition()); Log.d(TAG, "onNewFrame()"); } /** * 点击VR视频回调 */ @Override public void onClick() { super.onClick(); Log.d(TAG, "onClick()"); } /** * 加载VR视频失败回调 * @param errorMessage */ @Override public void onLoadError(String errorMessage) { super.onLoadError(errorMessage); Log.d(TAG, "onLoadError()->errorMessage=" + errorMessage); } /** * 加载VR视频成功回调 */ @Override public void onLoadSuccess() { super.onLoadSuccess(); /**加载成功后设置回调**/ seek_bar.setMax((int) vr_video_view.getDuration()); Log.d(TAG, "onNewFrame()"); } /** * 显示模式改变回调 * 1.默认 * 2.全屏模式 * 3.VR观看模式,即横屏分屏模式 * @param newDisplayMode 模式 */ @Override public void onDisplayModeChanged(int newDisplayMode) { super.onDisplayModeChanged(newDisplayMode); Log.d(TAG, "onLoadError()->newDisplayMode=" + newDisplayMode); } }); try { /**加载VR视频**/ vr_video_view.loadVideoFromAsset("test.mp4", options); } catch (IOException e) { e.printStackTrace(); } /**设置声音按钮点击监听**/ volume_toggle.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { setIsMuted(!isMuted); } }); /**设置播放暂停按钮点击监听**/ play_toggle.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { setIsPlay(!isPlay); } }); /**设置进度条拖动监听**/ seek_bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { /** * 进度条拖动改变监听 * @param seekBar 拖动条 * @param progress 进度 * @param fromUser 是否是用户手动操作的 */ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { /**调节视频进度**/ vr_video_view.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } /** * 设置声音开关 * * @param isMuted 开关 */ private void setIsMuted(boolean isMuted) { this.isMuted = isMuted; volume_toggle.setImageResource(isMuted ? R.drawable.volume_off : R.drawable.volume_on); vr_video_view.setVolume(isMuted ? 0.0f : 1.0f); } /** * 设置播放暂停 * * @param isPlay 播放暂停 */ private void setIsPlay(boolean isPlay) { this.isPlay = isPlay; play_toggle.setImageResource(isPlay ?R.drawable.pause: R.drawable.play ); if(isPlay){ vr_video_view.playVideo(); }else{ vr_video_view.pauseVideo(); } } public boolean isMuted() { return isMuted; } /** * 在销毁时关闭视频,防止内存溢出 */ @Override protected void onDestroy() { vr_video_view.shutdown(); super.onDestroy(); } }