Google VR for Android 敲門(mén)

Github

VRDemo

VR

虛擬現(xiàn)實(shí)(Virtual Reality)技術(shù)是一種可以創(chuàng)建和體驗(yàn)虛擬世界的計(jì)算機(jī)仿真系統(tǒng)轴合,它利用計(jì)算機(jī)生成一種模擬環(huán)境沃但,是一種多源信息融合的挖炬、交互式的三維動(dòng)態(tài)視景和實(shí)體行為的系統(tǒng)仿真, 使用戶(hù)沉浸到該環(huán)境中。

VR產(chǎn)品

Google VR for Android#

Google VR for Android支持DayDream和Cardboard。

SDK下載

使用git命名下載或者直接在github上下載壓縮包

git clone https://github.com/googlevr/gvr-android-sdk.git

官方Sample運(yùn)行

導(dǎo)入gvr-android-sdk到Android Studio, 同步的過(guò)程中需要下載很多庫(kù)所以會(huì)比較耗時(shí)剧蚣,另外可能出現(xiàn)build失敗的情況,這時(shí)可以嘗試使用本地的gradle來(lái)編譯旋廷。
gradle版本最好為最新版本鸠按。

gradle.png

simplepanowidget

simplepanowidget展示了印加文明遺跡馬丘比丘的全景圖(Panorama)

simplepanowidget.gif

在真機(jī)上運(yùn)行時(shí),會(huì)有一個(gè)Cardboard選項(xiàng)饶碘。

cardboard_option.jpg

點(diǎn)擊上圖紅色框中的按鈕即可進(jìn)入Cardboard模式目尖。

cardboard_mode.jpg

Demo代碼的主要邏輯就是加載一張全景圖放入VrPanoramaView中。

panoOptions = new Options();
panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER;//圖像類(lèi)型為立體圖像
istr = assetManager.open("andes.jpg");//加載assets目錄下的全景圖
panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions);

全景圖片andes是由兩張圖片組成扎运,上面一張是給左眼看瑟曲,下面一張是給右眼看。

圖片類(lèi)型

image_type.png

simeplevideowidget

simeplevideowidget展示了剛果雨林中大猩猩的360視頻豪治。

simplevideowidget.jpg

Demo的核心代碼是加載assets目錄下的congo.mp4視頻到VrVideoView中

videoWidgetView.loadVideoFromAsset("congo.mp4", options);

congo.mp4的視頻內(nèi)容也是分為上下部分洞拨,上面給左眼看,下面給右眼看负拟。

congo.png

treasurehunt

treasurehunt展示了一個(gè)簡(jiǎn)單到離譜的尋寶游戲扣甲,當(dāng)vr世界中矩形變成金黃色時(shí),點(diǎn)擊手機(jī)屏幕或者使用Daydream的控制器,即可完成尋寶琉挖。游戲還伴有音效启泣。

treasurehunter.gif

controllerclient

接收DayDream控制器輸入示例

videoplayer

使用Asynchronous Reprojection播放視頻示例

全景圖(PanoramaActivity)

1. 配置build.gradle

//修改minSDK為19
minSdkVersion 19
//添加依賴(lài)
compile 'com.google.vr:sdk-panowidget:1.20.0'

2. 配置AndroidManifest.xml

由于全景圖占內(nèi)存較大,當(dāng)加載多張全景圖時(shí)可能存在內(nèi)存溢出的情況示辈,所以這里開(kāi)啟largeHeap寥茫。

<application
    android:largeHeap="true">
</application>

3. 加載全景圖

private class LoadPanoramaImageTask extends AsyncTask<Void, Void, Bitmap> {

    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
            //加載assets目錄下的全景圖片
            AssetManager assetManager = getAssets();
            InputStream open = assetManager.open("andes.jpg");
            return BitmapFactory.decodeStream(open);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        VrPanoramaView.Options options = new VrPanoramaView.Options();
        //圖片類(lèi)型為立體圖像
        options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
        mVrPanoramaView.loadImageFromBitmap(bitmap, options);
    }
}

4. 繩命周期管理

@Override
protected void onPause() {
    mVrPanoramaView.pauseRendering();
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    mVrPanoramaView.resumeRendering();
}

@Override
protected void onDestroy() {
    // Destroy the widget and free memory.
    mVrPanoramaView.shutdown();
    // The background task has a 5 second timeout so it can potentially stay alive for 5 seconds
    // after the activity is destroyed unless it is explicitly cancelled.
    if (mLoadPanoramaImageTask != null) {
        mLoadPanoramaImageTask.cancel(true);
    }
    super.onDestroy();
}

5. 事件監(jiān)聽(tīng)

mVrPanoramaView.setEventListener(mVrPanoramaEventListener);

private VrPanoramaEventListener mVrPanoramaEventListener = new VrPanoramaEventListener() {
    /**
     * 點(diǎn)擊回調(diào)
     */
    @Override
    public void onClick() {
        super.onClick();
    }

    /**
     * 加載數(shù)據(jù)成功回調(diào)
     */
    @Override
    public void onLoadSuccess() {
        super.onLoadSuccess();
    }

    /**
     * 加載數(shù)據(jù)失敗回調(diào)
     */
    @Override
    public void onLoadError(String errorMessage) {
        super.onLoadError(errorMessage);
    }
};

360 視頻

1. 配置build.gradle

//添加依賴(lài)
//minSdkVersion 19//已經(jīng)配置則忽略
compile 'com.google.vr:sdk-videowidget:1.20.0'

2. 配置AndroidManifest.xml (已經(jīng)配置則忽略)##

<application
    android:largeHeap="true">
</application>

3. 加載視頻

VrVideoView.Options options = new VrVideoView.Options();
//視頻類(lèi)型為立體視頻
options.inputType = VrVideoView.Options.TYPE_STEREO_OVER_UNDER;
try {
    mVrVideoView.loadVideoFromAsset("congo.mp4", options);
} catch (IOException e) {
    e.printStackTrace();
}

4. 繩命周期管理

@Override
protected void onPause() {
    super.onPause();
    // Prevent the view from rendering continuously when in the background.
    mVrVideoView.pauseRendering();
    // If the video is playing when onPause() is called, the default behavior will be to pause
    // the video and keep it paused when onResume() is called.
    isPaused = true;
}

@Override
protected void onResume() {
    super.onResume();
    mVrVideoView.resumeRendering();
}

@Override
protected void onDestroy() {
    // Destroy the widget and free memory.
    mVrVideoView.shutdown();
    super.onDestroy();
}

5. 事件監(jiān)聽(tīng)

private VrVideoEventListener mVrEventListener = new VrVideoEventListener() {

    @Override
    public void onLoadError(String errorMessage) {
        Toast.makeText(VrVideoActivity.this, "onLoadError", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLoadSuccess() {
        Toast.makeText(VrVideoActivity.this, "onLoadSuccess", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onNewFrame() {
    }

    @Override
    public void onCompletion() {
        Toast.makeText(VrVideoActivity.this, "onCompletion", Toast.LENGTH_SHORT).show();
        mVrVideoView.seekTo(0);//播放結(jié)束后重新開(kāi)始播放
    }

    @Override
    public void onClick() {
        togglePause();//點(diǎn)擊暫停或者播放
    }
};

Demo

demo.gif

該Demo簡(jiǎn)單展示了全景圖控件VrPanoramaView的使用矾麻,及其相關(guān)的基本的配置纱耻。

初始化VrPanoramaView

private void initPanoramaView() {
    mVrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_panorama_view);
    //mVrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_MONO);//全屏模式,彈出一個(gè)全屏的Dialog
    mVrPanoramaView.setInfoButtonEnabled(false);//隱藏信息按鈕
    mVrPanoramaView.setStereoModeButtonEnabled(false);//隱藏cardboard按鈕
    mVrPanoramaView.setFullscreenButtonEnabled(false);//隱藏全屏按鈕
    mUrl = getIntent().getStringExtra("url");
    OkGo.get(mUrl).cacheKey(mUrl).tag(mUrl).execute(new BitmapCallback() {

        @Override
        public void onSuccess(Bitmap bitmap, Call call, Response response) {
            VrPanoramaView.Options options = new VrPanoramaView.Options();
            //設(shè)置圖片類(lèi)型為單通道圖片
            options.inputType = VrPanoramaView.Options.TYPE_MONO;
            mVrPanoramaView.loadImageFromBitmap(bitmap, options);
        }
    });
}

初始化MediaPlayer

/**
 * 如果有音樂(lè)數(shù)據(jù)則播放音樂(lè)
 */
private void initMediaPlayer() {
    String mp3 = getIntent().getStringExtra("mp3");
    if (mp3 != null) {
        mMediaPlayer = new MediaPlayer();
        try {
            mMediaPlayer.setDataSource(this, Uri.parse(mp3));
            mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
            mMediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

繩命周期管理

@Override
protected void onResume() {
    super.onResume();
    mVrPanoramaView.resumeRendering();
}

@Override
protected void onPause() {
    super.onPause();
    mVrPanoramaView.pauseRendering();
    if (mMediaPlayer != null) {
        mMediaPlayer.pause();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mVrPanoramaView.shutdown();
    OkGo.getInstance().cancelTag(mUrl);//取消請(qǐng)求
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末险耀,一起剝皮案震驚了整個(gè)濱河市弄喘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甩牺,老刑警劉巖蘑志,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贬派,居然都是意外死亡急但,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)搞乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)波桩,“玉大人,你說(shuō)我怎么就攤上這事请敦「涠悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵侍筛,是天一觀(guān)的道長(zhǎng)匀油。 經(jīng)常有香客問(wèn)我,道長(zhǎng)勾笆,這世上最難降的妖魔是什么敌蚜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮窝爪,結(jié)果婚禮上弛车,老公的妹妹穿的比我還像新娘。我一直安慰自己蒲每,他們只是感情好纷跛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著邀杏,像睡著了一般贫奠。 火紅的嫁衣襯著肌膚如雪唬血。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天唤崭,我揣著相機(jī)與錄音拷恨,去河邊找鬼。 笑死谢肾,一個(gè)胖子當(dāng)著我的面吹牛腕侄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芦疏,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冕杠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酸茴?” 一聲冷哼從身側(cè)響起分预,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薪捍,沒(méi)想到半個(gè)月后笼痹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飘诗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年与倡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了界逛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆稿。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖息拜,靈堂內(nèi)的尸體忽然破棺而出溉潭,到底是詐尸還是另有隱情,我是刑警寧澤少欺,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布喳瓣,位于F島的核電站,受9級(jí)特大地震影響赞别,放射性物質(zhì)發(fā)生泄漏畏陕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一仿滔、第九天 我趴在偏房一處隱蔽的房頂上張望惠毁。 院中可真熱鬧,春花似錦崎页、人聲如沸鞠绰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜈膨。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁巍,已是汗流浹背驴一。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曙咽,地道東北人蛔趴。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像例朱,于是被迫代替她去往敵國(guó)和親孝情。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容