通過Android實現簡單的VR全景圖
前言:
2016年被稱為VR元年,VR的火熱就像當年的andorid剛進入中國市場一樣。或許VR在發展上還有很多障礙,但卻擋不住我們體驗VR虛擬效果時帶給我們的驚豔。下面就通過android做一個簡單的VR全景圖效果。
實現VR全景圖效果
首先我們要下載VR庫檔案。Google官網為我們提供了VR資源的下載:
https://github.com/googlevr/gvr-android-sdk/
實現VR步驟:
0.0 在專案裡新建一個資產目錄assets,把圖片放入資產目錄下。
1.0 在清單檔案下Application節點中加入android:largeHeap=”true”的屬下節點.
2.0 匯入VR需要依賴的library庫,以導module的方式去匯入:Common,Commonwidge,Panowidget
3.0 在Module的build.gradle檔案裡dependencies,新增:compile ‘com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7’
4.0 完成專案XML佈局,VrPanoramaView
5.0 由於VR資源資料量大,獲取需要時間,故把載入圖片放到子執行緒中進行,主執行緒來顯示圖片,可以使用一個非同步執行緒AsyncTask或EventBus技術完成
6.0 因為VR很佔用記憶體,所以當介面進入onPause狀態,暫停VR檢視顯示,進入onResume狀態,繼續VR檢視顯示,進入onDestroy狀態,殺死VR,關閉非同步任務
7.0 設定對VR執行狀態的監聽,如果VR執行出現錯誤,可以及時的處理.
8.0 播放VR效果,只需執行非同步任務即可.
步驟演示:
1.在專案main下新建一個資產目錄:assets,放入VR圖片
2.在清單檔案下Application節點中加入 android:largeHeap=”true”的屬下節點(使用VR的資源很消耗記憶體,所以我們為了避免OOM(記憶體溢位)的問題,要把警報許可權提高,從192提高到512m)
3.在Module的build.gradle檔案裡dependencie中加入:compile ‘com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7’
匯入VR需要依賴的library庫,以導model的方式去匯入:Common,Commonwidge,Panowidget
4.關聯你的庫檔案:ctrl+alt+shift+s在開啟的對話方塊中,選擇你原本的專案app,選擇第四個Dependencise,點選右上角”+”,選擇第三個Module dependency,在開啟的對話方塊中,選擇之前匯入的庫檔案。
5.匯入完畢後,修改你的minSdkVersion 為匯入庫的最低版本相匹配,
6.在xml中驗證是否匯入成功:
在MainActivity中的程式碼:
1.例項化VR控制元件:
2..因為讀取VR的資源是一個耗時操作(VR資源非常大,讀取需要時間)所以我們不能在主執行緒去做讀取操作,但是隻有在主執行緒才能做UI的更新,故我們使用AsyncTask執行緒去讀取。
到這基本上就已經可以基本實現VR全景圖的效果啦。但是在異常情況下我們還是要做一下處理,下面是我的總程式碼,都寫有註釋:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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;
// 匯入三個庫檔案,common:基本庫檔案 commonwidget:基本檢視控制元件檔案 ,panowidget:全景圖
public class MainActivity extends AppCompatActivity {
private ImagerLoaderTask imagerLoaderTask;
private VrPanoramaView mVrPanoramaView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//A 對VR控制元件初始化 ctrl+alt+f 抽取成員變數
mVrPanoramaView = (VrPanoramaView) findViewById(R.id.VRP);
// 隱藏掉VR效果左下角的資訊按鈕顯示
mVrPanoramaView.setInfoButtonEnabled(false);
// 隱藏VR效果右下角全屏顯示的按鈕
mVrPanoramaView.setFullscreenButtonEnabled(false);
// 切換VR的模式 引數:VrWidgetView.DisplayMode.FULLSCREEN_STEREO裝置模式(手機橫看)(.FULLSCREEN_MONO手機模式)
mVrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
// 設定對VR執行狀態的監聽,如果VR執行出現錯誤,可以及時處理
mVrPanoramaView.setEventListener(new MVREventListener());
// B 使用自定義的AsyncTask,播放VR效果
imagerLoaderTask = new ImagerLoaderTask();
imagerLoaderTask.execute();
}
// 因為讀取VR的資源是一個耗時操作(VR資 源非常大,讀取需要時間)所以我們不能再主執行緒去做讀取操作,
// 但是隻有在主執行緒才能做UI的更新,故我們使用AsyncTask
private class ImagerLoaderTask extends AsyncTask<Void,Void,Bitmap>{// 以後EventBus去替代
// B 該方法在子執行緒執行,從本地檔案中把資源載入到記憶體中
// 此方法中定義要執行的後臺任務,在這個方法中可以呼叫publishProgress來更新任務進度
@Override
protected Bitmap doInBackground(Void... params) {
try {
// 從資產目錄拿到資源,返回結果是位元組流
InputStream inputStream = getAssets().open("andes.jpg");
// 把位元組流轉換成Bitmap物件
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
// 返回出bitmap
return bitmap;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// 接收bitmap執行在主執行緒中
@Override
protected void onPostExecute(Bitmap bitmap) {
// 建立VrPanoramaView.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();
// 繼續渲染和顯示 resumeRendering();重新閱讀
mVrPanoramaView.resumeRendering();
}
// 當Activity銷燬時,回撥
@Override
protected void onDestroy() {
// 關閉渲染檢視
mVrPanoramaView.shutdown();
if (imagerLoaderTask!=null){
// 退出activity時,如果非同步任務沒有取消,就取消
if (imagerLoaderTask.isCancelled()){
imagerLoaderTask.cancel(true);
}
}
super.onDestroy();
}
// VR執行狀態監聽類,自定義一個類,繼承
private class MVREventListener extends VrPanoramaEventListener{
// 當VR檢視載入成功的時候,回撥
@Override
public void onLoadSuccess() {
super.onLoadSuccess();
Toast.makeText(MainActivity.this, "載入成功", Toast.LENGTH_SHORT).show();
}
public void onLoadError(String errorMessage){
super.onLoadError(errorMessage);
Toast.makeText(MainActivity.this, "載入失敗", Toast.LENGTH_SHORT).show();
}
}
}
最後還是要展示一下炫酷的效果:
最後希望共同學習,共同進步。
相關推薦
通過Android實現簡單的VR全景圖
前言: 2016年被稱為VR元年,VR的火熱就像當年的andorid剛進入中國市場一樣。或許VR在發展上還有很多障礙,但卻擋不住我們體驗VR虛擬效果時帶給我們的驚豔。下面就通過android做一個簡單的VR全景圖效果。 實現VR全景圖效果
Unity Gyro之使用陀螺儀實現簡單VR全景環視效果
轉https://jingyan.baidu.com/article/3aed632ec0f421701180914e.html 開啟Unity,新建一個空工程,具體如下圖 在場景中佈置一些物體作為參照,把相機置於其中,便於觀察,具體如下圖 拷貝MainCamer
android 實現簡單的引導層圖層功能
在網上看的一個帖子,我進行了整理用的 kotlin 寫的,還是比較簡單的,廢話不多說。 原檔案地址 https://www.jianshu.com/p/5e80c7aee1fc 首先先來看下如何匯入專案中: 專案的build.gradle新增 allprojects {
Android google VR全景圖導航
package palmartourism.iwiteks.www.hiqdn; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import andr
通過Android實現VR視訊的播放
實現VR視訊的播放和前面寫過的VR全景圖的展示差不多,改變的也只是庫檔案的不同,資源目錄下的資源不同而已。下面就來說一下步驟。 先展示一下效果圖 完成步驟: 1.以匯入Moudle的方式匯入庫檔案。(videowidget,common,commonwi
Android自定義View實現簡單的折線圖、柱狀圖
首先說第一個柱狀圖,實現很簡單。一個自定義View,重現裡面的OnDraw方法。然後利用paint,canvas繪製帶填充的長方形即可。每個長方形的X軸平方View的x軸即可,長方形的高度通過簡單的計算即可得到。下面上柱狀圖程式碼 package com.hrules.
二、VR全景圖顯示器開發 ---- Android VR視訊/Google VR for Android /VR Pano/VR Video
這篇看下SimpleVrPanorama這個栗子 SimpleVrPanorama 其實這篇應該寫SimpleVrPanorama和simplevideowidget 兩個,但是由於篇幅過長就分開寫了 演示 用AS錄的沒有觸控點顯示,
原生js實現簡單的焦點圖效果
begin pic false doctype 目標 16px urn 旅行 .cn 用到一些封裝好的運動函數,主要是定時器 效果為圖片和圖片的描述定時自動更換 <!DOCTYPE html> <html> <head>
通過Python實現簡單的計算器
arch turn for return lac 空格 用戶 所有 計算器 計算器開發需求 實現加減乘除及拓號優先級解析 用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))
通過 JS 實現簡單的拖拽功能並且可以在特定元素上禁止拖拽
如何 alt targe 但是 mes 並且 mod closed demo 前言 關於講解 JS 的拖拽功能的文章數不勝數,我確實沒有必要大費周章再寫一篇重復的文章來吸引眼球。本文的重點是講解如何在某些特定的元素上禁止拖拽。這是我在編寫插件時遇到的問題,其實很多插件的拖
通過Tesseract實現簡單的OCR
現在 研究 .tar.gz 安裝 macports nload 代碼 如果 ria Tesseract 簡介 Tesseract 的 OCR 引擎最先由 HP 實驗室於 1985 年開始研發,至 1995 年時已經成為 OCR 業內最準確的三款識別引擎之一。然而,HP
Unty中通過鏡像優化HDRI全景圖體積
鏡像 github上 體積 org scrip atl 比較 code phi 全景圖即HDRI貼圖,可以代替6面cubemap,傳統3D軟件運用比較廣。一般反射探針,天空盒等都會用到。 但是體積過大是個問題,特別是移動端會對包體大小進行控制,雖說可以通過球面貼圖替換掉部分
通過scrapy實現簡單爬蟲
Scrapy概述 網路爬蟲,大概很多人都聽說過吧。 它是通過一定的規則,自動抓取網際網路網站上的文章、資訊、圖片等等內容。 常見的應用就是搜尋引擎。 而Scrapy則是實現網路爬蟲的方式之一。 官方描述的Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 可
原生js實現簡單輪播圖效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首頁</title> <style> .father{
JDBC通過PreparedStatement實現簡單的錄入資料的操作
1.首先先建立一張表: 2 實現從控制檯輸入學生的資訊的功能: /** * 從控制檯輸入學生的資訊 * @return */ private Student getStudentFromConsole() { Scanner scanner =
基於AndroidStudio開發Android實現簡單的註冊登入 POST方式提交資料
登入佈局頁面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns
OC 使用TZImagePickerController實現簡單的多圖選擇檢視
1.使用pod在專案中匯入TZImagePickerController: pod 'TZImagePickerController' 2.建立檢視ImagePickView: @protocol ImagePickerViewDelegate <NSO
非同步程式設計學習之路(一)-通過Thread實現簡單多執行緒
自上週主管帶我看過kafka內部實現,使用Feature來做的資料批量傳送之後,自此決定要學好併發程式設計。 因為本人在多執行緒上只能說是一個新手,打算從最底層的Thread一步一步記錄我的學習之路。 通過Thread實現多執行緒的方式有兩種,程式碼如下: 一、多執行緒實現(繼承Thre
Android 實現簡單的登陸註冊功能(SharedPreferences和SQLite)
最近剛好做了一個Android的登入註冊介面,將資料利用SharedPreferences或者SQLite繫結到Android程式中,實現簡單的登陸註冊功能,本文未涉及到與伺服器的交流。 首先,對於登陸註冊要有一個明確的邏輯順序,不管是對於SharedPreferences
Android實現簡單音樂播放器(MediaPlayer)
工程內容 實現一個簡單的音樂播放器,要求功能有: 播放、暫停功能;進度條顯示播放進度功能拖動進度條改變進度功能;後臺播放功能;停止功能;退出功能; 程式碼實現 匯入歌曲到手機SD卡的Music目錄中,這裡我匯入了4首歌曲:仙劍六裡面的《誓言成暉》、《劍客不能說》、《鏡