Daydream VR入門基礎教程,通過GVR示例SimpleVrPanorama製作VR全景圖形應用
阿新 • • 發佈:2019-01-24
dependencies {
compile project(':libraries-common') //Google VR API的公共程式碼。
compile project(':libraries-commonwidget') //Google VR API的公共元件。
compile project(':libraries-panowidget') //VR全景檢視元件
compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7' //序列化資料結構的方案
}
然後我們看看主程式碼(官方程式碼過於冗餘,為方便新人理解學習,修改成如下):
程式碼很簡單,流程就是獲取VrPanoramaView元件——新增事件監聽——非同步載入圖片。package com.google.vr.sdk.samples.simplepanowidget; import android.app.Activity; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.util.Pair; import com.google.vr.sdk.widgets.pano.VrPanoramaEventListener; import com.google.vr.sdk.widgets.pano.VrPanoramaView; import com.google.vr.sdk.widgets.pano.VrPanoramaView.Options; import java.io.IOException; import java.io.InputStream; public class SimpleVrPanoramaActivity extends Activity { private static final String TAG = "SimpleVrPanoramaActivity"; private VrPanoramaView panoWidgetView;//VR全景圖形元件 private String fileUri = "andes.jpg";//assets資料夾下的檔名 private Options panoOptions = new Options();//VrPanoramaView需要的設定 private ImageLoaderTask backgroundImageLoaderTask;//非同步載入圖片 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout);//獲取佈局 panoWidgetView = (VrPanoramaView) findViewById(R.id.pano_view);//初始化VrPanoramaView panoWidgetView.setEventListener(new ActivityEventListener());//為VrPanoramaView新增監聽 //如果有任務在執行則停止它 if (backgroundImageLoaderTask != null) { backgroundImageLoaderTask.cancel(true); } //設定inputType 為TYPE_STEREO_OVER_UNDER. 在後面會介紹TYPE_STEREO_OVER_UNDER的,暫時當做一個圖片的顯示型別就行 panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER; //建立圖片非同步載入任務 backgroundImageLoaderTask = new ImageLoaderTask(); //執行任務。將圖片名(根據專案實際情況傳吧)和設定傳入 backgroundImageLoaderTask.execute(Pair.create(fileUri, panoOptions)); } //非同步任務 class ImageLoaderTask extends AsyncTask<Pair<String, Options>, Void, Boolean> { @Override protected Boolean doInBackground(Pair<String, Options>... fileInformation) {//真正寫專案根據情況新增條件判斷吧 InputStream istr = null; try { istr = getAssets().open(fileInformation[0].first);//獲取圖片的輸入流 } catch (IOException e) { Log.e(TAG, "Could not decode default bitmap: " + e); return false; } Bitmap bitmap = BitmapFactory.decodeStream(istr);//建立bitmap panoWidgetView.loadImageFromBitmap(bitmap, fileInformation[0].second);//引數一為圖片的bitmap,引數二為 VrPanoramaView 所需要的設定 try { istr.close();//關閉InputStream } catch (IOException e) { Log.e(TAG, "Could not close input stream: " + e); } return true; } } private class ActivityEventListener extends VrPanoramaEventListener { @Override public void onLoadSuccess() {//圖片載入成功 Log.e(TAG, "onLoadSuccess"); } @Override public void onLoadError(String errorMessage) {//圖片載入失敗 Log.e(TAG, "Error loading pano: " + errorMessage); } @Override public void onClick() {//當我們點選了VrPanoramaView 時候出發 super.onClick(); Log.e(TAG, "onClick"); } @Override public void onDisplayModeChanged(int newDisplayMode) {//改變顯示模式時候出發(全屏模式和紙板模式) super.onDisplayModeChanged(newDisplayMode); Log.e(TAG, "onDisplayModeChanged"); } } @Override protected void onPause() { panoWidgetView.pauseRendering();//暫停3D渲染和跟蹤 super.onPause(); } @Override protected void onResume() { super.onResume(); panoWidgetView.resumeRendering();//恢復3D渲染和跟蹤 } @Override protected void onDestroy() { panoWidgetView.shutdown();//關閉渲染下並釋放相關的記憶體 if (backgroundImageLoaderTask != null) { backgroundImageLoaderTask.cancel(true);//停止非同步任務 } super.onDestroy(); } }
如果想要隱藏VrPanoramaView元件的按鈕:
panoWidgetView.setFullscreenButtonEnabled(false); // 是否啟用全屏按鈕
panoWidgetView.setStereoModeButtonEnabled(false); // 是否啟用紙盒按鈕
瞭解Options