1. 程式人生 > >Daydream VR入門基礎教程,通過GVR示例SimpleVrPanorama製作VR全景圖形應用

Daydream VR入門基礎教程,通過GVR示例SimpleVrPanorama製作VR全景圖形應用

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' //序列化資料結構的方案
}

然後我們看看主程式碼(官方程式碼過於冗餘,為方便新人理解學習,修改成如下):
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元件——新增事件監聽——非同步載入圖片。
如果想要隱藏VrPanoramaView元件的按鈕:

panoWidgetView.setFullscreenButtonEnabled(false); // 是否啟用全屏按鈕
panoWidgetView.setStereoModeButtonEnabled(false); // 是否啟用紙盒按鈕

瞭解Options