Android VR 全景圖

Android VR 全景圖 
效果圖


谷歌的VR:

虛擬實境(英語:virtual reality,縮寫爲VR),簡稱虛擬技術,也稱虛擬環境,是利用電腦模擬產生一個三維空間的虛擬世界,提供用戶關於視覺等感官的模擬,讓用戶感覺彷彿身歷其境,可以及時、沒有限制地觀察三維空間內的事物。用戶進行位置移動時,電腦可以立即進行復雜的運算,將精確的三維世界視頻傳回產生臨場感。該技術集成了計算機圖形計算機仿真人工智能、感應、顯示及網絡並行處理等技術的最新發展成果,是一種由計算機技術輔助生成的高技術模擬系統

VR軟件:愛美藝家VR,房總管VR,旅行VR,VR科學館,百度VR,騰訊炫境VR

功能:增強虛擬現實

VR資源下載

Google VR 技術 官網:(需要翻牆)
點擊打開鏈接
android VR 資源下載網址:
點擊打開鏈接
android VR API:(需要翻牆)
點擊打開鏈接

VR全景圖步驟

第一步:搭建VR開發環境,添加資源,修改Gradle,清單文件等

打開Android VR 資源下載網址下載資源


新建一個項目,選擇Project目錄>app目錄>src>main中新建一個Directory命名爲assets,用於存放全景圖


在清單文件中添加android:largeHeap="true"

因爲使用VR的資源很消耗內存,所以我們爲了避免OOM的問題,要把警報權限提高,從192提高到512m


在app項目下的build.gradle中添加

compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
並修改版本號爲19

minSdkVersion 19
如果不修改版本號會報一下錯誤,這個錯就是說最低版本不能低於16,故需要修改


導入之前Android VR 資源下載網址下載的庫文件:導入三個庫文件,commomcommomwidgetpanowidget


導入庫文件點擊File>New>Import Moudle,粘貼庫文件路徑點擊Finish

這裏只演示一個,剩下兩個以此類推


導入成功後,進行關聯三個項目

在主類中按住control+shift+alt+s點擊app點擊Deoendencies點擊+選擇第三個關聯


在佈局文件中輸入<Vr,如果出現以下代碼表示關聯成功

<com.google.vr.sdk.widgets.pano.VrPanoramaView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.google.vr.sdk.widgets.pano.VrPanoramaView>

搭建VR開發環境到此結束

第二步:完成項目XML佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.cxy.vr_cxy.MainActivity">

    <com.google.vr.sdk.widgets.pano.VrPanoramaView
        android:id="@+id/vp_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.google.vr.sdk.widgets.pano.VrPanoramaView>
</RelativeLayout>

第三步:編寫主類MainActivity,自定義AsyncTask,讀取和顯示VR全景圖, 對VR消耗資源進行優化,監聽VR運行狀態,播放VR效果

package com.example.cxy.vr_cxy;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.google.vr.sdk.widgets.common.VrWidgetView;
import com.google.vr.sdk.widgets.pano.VrPanoramaEventListener;
import com.google.vr.sdk.widgets.pano.VrPanoramaView;

import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {
    private VrPanoramaView mVrPanoramaView;
    private ImagerLoaderTask mImagerLoaderTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //A.VR控件初始化
        mVrPanoramaView = (VrPanoramaView) findViewById(R.id.vp_view);
        //隱藏掉VR效果左下角的信息按鈕顯示
        mVrPanoramaView.setInfoButtonEnabled(false);
        //隱藏掉VR效果右下角全屏顯示的按鈕
        mVrPanoramaView.setFullscreenButtonEnabled(false);
        //切換VR的模式   參數VrWidgetView.DisplayMode.FULLSCREEN_STEREO設備模式(手機橫着放)     VrWidgetView.DisplayMode.FULLSCREEN_MONO:手機模式
        mVrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
        //C.設置對VR運行狀態的監聽,如果VR運行出現錯誤,可以及時處了.
        mVrPanoramaView.setEventListener(new MyVREventListener());
        //B.使用自定義的AsyncTask,播放VR效果
        mImagerLoaderTask = new ImagerLoaderTask();
        mImagerLoaderTask.execute();

    }

    //因爲讀取VR的資源是一個耗時操作(VR資源非常大,讀取需要時間),所以我們不能夠在主線程去做讀取,但是只有在主線程才能做UI的更新,故我們使用AsyncTask.
    private class ImagerLoaderTask extends AsyncTask<Void, Void, Bitmap> {//以後EventBus去替代.

        //B.該方法在子線程運行,從本地文件中把資源加載到內存中
        @Override
        protected Bitmap doInBackground(Void... voids) {
            try {
                //從資產目錄拿到資源,返回結果是字節流
                InputStream inputStream = getAssets().open("andes.jpg");
                //把字節流轉換成Bitmap對象
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            //創建bVrPanoramaView.Options,去決定顯示VR是普通效果,還是立體效果
            VrPanoramaView.Options options = new VrPanoramaView.Options();
            //TYPE_STEREO_OVER_UNDER立體效果:圖片的上半部分放在左眼顯示,下半部分放在右眼顯示     TYPE_MONO:普通效果
            options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
            //使用VR控件對象,顯示效果  參數:1.Bitmap對象      2.VrPanoramaView.Options對象,決定顯示的效果
            mVrPanoramaView.loadImageFromBitmap(bitmap, options);
            super.onPostExecute(bitmap);
        }
    }

    //因爲VR很佔用內存,所以當界面進入onPause狀態,暫停VR視圖顯示,進入onResume狀態,繼續VR視圖顯示,進入OnDestroy,殺死VR,關閉異步任務

    //當失去焦點時,回調
    @Override
    protected void onPause() {
        //暫停渲染和顯示
        mVrPanoramaView.pauseRendering();
        super.onPause();
    }

    //當重新獲取到焦點時,回調
    @Override
    protected void onResume() {
        super.onResume();
        //繼續渲染和顯示
        mVrPanoramaView.resumeRendering();
    }

    //Activity銷燬時,回調
    @Override
    protected void onDestroy() {
        //關閉渲染視圖
        mVrPanoramaView.shutdown();
        if (mImagerLoaderTask != null) {
            //在退出activity,如果異步任務沒有取消,就取消
            if (!mImagerLoaderTask.isCancelled()) {
                mImagerLoaderTask.cancel(true);
            }
        }
        super.onDestroy();
    }

    //VR運行狀態監聽類,自定義一個類繼承
    private class MyVREventListener extends VrPanoramaEventListener {
        //VR視圖加載成功的時候回調
        @Override
        public void onLoadSuccess() {
            super.onLoadSuccess();
            Toast.makeText(MainActivity.this, "加載成功", Toast.LENGTH_SHORT).show();

        }

        //VR視圖加載失敗的時候回調
        @Override
        public void onLoadError(String errorMessage) {
            super.onLoadError(errorMessage);
            Toast.makeText(MainActivity.this, "加載失敗", Toast.LENGTH_SHORT).show();
        }
    }
}

VR步驟總結
1.在項目裏新建一個資產目錄assets,把圖片放入資產目錄下,
        2.在清單文件下Application節點中加入android:largeHeap="true"的屬下節點.
        3.導入VR需要依賴的library庫,以導model的方式去導入:Common,Commonwidge,Panowidget
        4.在Module的build.gradle文件裏dependencies,添加:compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'
        5.完成項目XML佈局,VrPanoramaView
        6.由於VR資源數據量大,獲取需要時間,故把加載圖片放到子線程中進行,主線程來顯示圖片,可以使用一個異步線程AsyncTask或EventBus技術完成
        7.因爲VR很佔用內存,所以當界面進入onPause狀態,暫停VR視圖顯示,進入onResume狀態,繼續VR視圖顯示,進入onDestroy狀態,殺死VR,關閉異步任務
        8.設置對VR運行狀態的監聽,如果VR運行出現錯誤,可以及時的處理.
        9.播放VR效果,只需執行異步任務即可.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章