最近项目需要,花了一段时间去研究这门技术。发现随着VR设备的流行开来,各大招聘平台上也发布了不少关于andorid VR开发相关的Android工程师岗位,从这点来说掌握VR在项目中的实际应用要点,有助于大家为自己的开发经验上增加前沿技术的积累。
经过研发市面上的主流vr app 的功能,抽取并整合项目中的vr开发知识点,希望大家掌握后,在企业相关vr app游刃有余。
1. 全景图片显示
2. 导入全景图相关的三个开发库
commonwidget、common、panowidget(全景图)、videowidget(视频)
PS:最新的SDK已经没有这三个文件夹了,使用下一步的依赖库即可
2.1 或者添加依赖
compile 'com.google.vr:sdk-panowidget:1.30.0'
//compile project(':common')
//compile project(':commonwidget')
//compile project(':panowidget')
//google的一套序列化数据结构开发库
//compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
PS:版本要求:<usessdkandroid:minSdkVersion="19"android:targetSdkVersion="22"/>
2.3 配置清单文件
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
<applicationandroid:label="SimpleVrPanoramaActivity"
android:largeHeap="true"
android:theme="@android:style/Theme.Holo.Light">
<activityandroid:name=".SimpleVrPanoramaActivity">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
<categoryandroid:name="com.google.intent.category.CARDBOARD"/>
</intent-filter>
</activity>
</application>
PS:android:largeHeap="true" 全景图片比较耗资源
2.4 准备全景图片测试资源
放在assets目录 例:assets/img.jpg
3 布局加载 全景资源(图片)控件
<com.google.vr.sdk.widgets.pano.VrPanoramaView
android:id="@+id/picView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
4 初始化控件以及监控加载事件
package com.fw.dagger.vr;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import com.google.vr.sdk.widgets.pano.VrPanoramaView;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
public VrPanoramaView vrPanoramaView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vrPanoramaView = findViewById(R.id.vrPanoramaView);
vrPanoramaView.setTouchTrackingEnabled(true);
vrPanoramaView.setFullscreenButtonEnabled(true);
vrPanoramaView.setInfoButtonEnabled(false);
vrPanoramaView.setStereoModeButtonEnabled(false);
VrPanoramaView.Options options = new VrPanoramaView.Options();
options.inputType = VrPanoramaView.Options.TYPE_MONO;
vrPanoramaView.loadImageFromBitmap(getBitmapFromAssets("timg.jpg"), options);
}
private Bitmap getBitmapFromAssets(String fileName) {
if (TextUtils.isEmpty(fileName)) return null;
try {
InputStream inputStream = getAssets().open(fileName);
return BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onResume() {
super.onResume();
vrPanoramaView.resumeRendering();
}
@Override
protected void onPause() {
super.onPause();
vrPanoramaView.pauseRendering();
}
@Override
protected void onDestroy() {
vrPanoramaView.shutdown();
super.onDestroy();
}
}
5 界面其他元素设置:
- setFullscreenButtonEnabled (false);//隐藏全屏模式按钮
- setVrModeButtonEnabled(false);//隐藏VR模式按钮
- vrImage.setInfoButtonEnabled(false);//隐藏信息按钮
6 Options参数:
- public static final int TYPE_MONO = 1;
图像被预期以覆盖沿着其水平轴360度,而垂直范围是根据图像的宽高比来计算。
例如,如果一个1000x250像素的图像,给出所述全景将覆盖360x90度与垂直范围是-45至+45度 - public static final int TYPE_STEREO_OVER_UNDER = 2;
包含两个大小相等的投影 全景图垂直叠加。顶部图像被显示给左眼、底部图像被显示给右眼
图像将覆盖沿水平轴360度,而垂直范围是根据图像的宽高比来计算。
例如,如果一个1000x500像素的图像中给出(即1000x250像素/每个眼睛),全景将覆盖360x90度与垂直范围是-45至+45度。