谷歌的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 資源下載網址下載的庫文件:導入三個庫文件,commom,commomwidget,panowidget
導入庫文件點擊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效果,只需執行異步任務即可.