概念:虚拟实境(英语:virtual reality,缩写为VR),简称虚拟技术 , 是利用电脑模拟产生一个三维空间的虚拟世界,提供用户关于视觉等感官的模拟,让用户感觉仿佛身历其境,可以及时、没有限制地观察三维空间内的事物。
功能:增加虚拟现实
1.0 搭建VR开发环境,添加资源,修改Gradle,清单文件等
在main 文件下新建一个asstes 文件夹,中存放VR全景图
因为使用VR的资源很消耗内存,为了避免OOM(OutOfMemory)的问题,要把警报权限提高,从192提到512
故 要在清单文件下加一段下列代码:
android:largeHeap="true"
修改Gradle文件:该项目中做的是全景图,故在全景图的文件中修改相对应的grandle文件
在自己的项目中grandle文件中添加:下面一段代码
compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
导入库文件:目的是使用VR里的方法和控件
选择你需要的库文件,不要都导进去,否则会导致APK的容量过大;
复制其路径,以moudle的形式导进项目中 如下:
注意此项目的API版本为19 如不是则修改成19或19以上 如下
关联库文件 shift+ctrl+alt+s
三个全选中:
验证 库文件是否导入成功:出现如下,就成功了
2.0 完成项目XML布局
<com.google.vr.sdk.widgets.pano.VrPanoramaView
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.google.vr.sdk.widgets.pano.VrPanoramaView>
3.0在MainActivity中添加主要代码
public class MainActivity extends AppCompatActivity {
private VrPanoramaView vrPanoramaView;
private ImagerLoaderTask imagerLoaderTask;
//导入三个文件库,common(基本库文件) commonwidget(基本的控件文件) panowidget(全景图 自己可选择)
// 直接把文件的路径复制进去
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1 控件初始化
vrPanoramaView = (VrPanoramaView) findViewById(R.id.vrp_view);// ctrl +alt+f 自动生成成员变量
// 隐藏掉VR效果左下角的信息按钮显示
vrPanoramaView.setInfoButtonEnabled(false);
// 隐藏掉VR效果右下角的全屏显示效果
vrPanoramaView.setFullscreenButtonEnabled(false);
//切换VR的模式 参数 VrPanoramaView.DisplayMode.FULLSCREEN_MONO设备模式(横着放)
vrPanoramaView.setDisplayMode(VrPanoramaView.DisplayMode.FULLSCREEN_STEREO);
// 使用自定义运行状态的监听,播放VR效果
vrPanoramaView.setEventListener(new MyVREentListener());
//使用自定义的AsyncTask,播放VR效果
imagerLoaderTask = new ImagerLoaderTask();
imagerLoaderTask.execute();
}
//因为读取VR的资源是一个耗时操作(VR的资源非常大,读取需要时间),所以我们不能够在主线程去读取,但是只有在主线程才能做UI的更新,故我们使用
//AsyTask
private class ImagerLoaderTask extends AsyncTask<Void,Void,Bitmap>{//以后用EvebtBus去代替
//2.该方法在子线程运行,从本地文件把资源加载到内存中
@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;
}
//用来接收 doInBackground方法返回的bitmap
@Override
protected void onPostExecute(Bitmap bitmap) {
//创建VrPanoramaView.Options,去决定显示VR是普通效果,还是立体效果
VrPanoramaView.Options options = new VrPanoramaView.Options();//ctrl+alt+v 自动生成对象的类名
//TYPE_STEREO_OVER_UNDER立体效果:图片的上半部分是在左眼显示,下半部分是在右眼显示,TYPE_MONO:普通效果
options.inputType=VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
//使用VR控件对象,显示效果, 参数:1,Bitmap对象 2.VrPPanoramaView.OPtions对象,决定显示的效果
vrPanoramaView.loadImageFromBitmap(bitmap,options);
super.onPostExecute(bitmap);
}
}
//进行VR视图的优化
// 因为VR很占用内存,所以当界面进入onPause状态,暂停VR视图显示,进入onResum状态,继续VR视图显示,进入onDestroy,杀死VR,关闭异步任务
// 当失去焦点是回调
@Override
protected void onPause() {
//暂停渲染和显示 随着屏幕的暂停,也要暂停VR视图
vrPanoramaView.pauseRendering();
super.onPause();
}
//当重新获取焦点时,回调
@Override
protected void onResume() {
super.onResume();
//继续渲染和显示
vrPanoramaView.resumeRendering();
}
//当activity 销毁时回调
@Override
protected void onDestroy() {
//关闭渲染视图
vrPanoramaView.shutdown();
if(imagerLoaderTask !=null){
if(!imagerLoaderTask.isCancelled()){
//在退出activity时,如果异步任务没有取消,就取消
imagerLoaderTask.cancel(true);
}
}
super.onDestroy();
}
// VR运行状态监听类,自定义一个类继承
private class MyVREentListener extends VrPanoramaEventListener{
//当VR视图加载成功时回调
public void onLoadSuccess(){
super.onLoadSuccess();
Toast.makeText(MainActivity.this,"加载成功",Toast.LENGTH_SHORT).show();
}
//当VR视图加载失败时回调
public void onLoadError(String errorMessage){
super.onLoadError(errorMessage);
Toast.makeText(MainActivity.this,"加载失败",Toast.LENGTH_SHORT).show();
}
}
}
程序运行效果图: