對Android應(yīng)用開發(fā)實踐說明
下面文章介紹下什么是Android應(yīng)用開發(fā),再介紹Android應(yīng)用開發(fā)的之前,首先先讓大家了解下什么是Android應(yīng)用開發(fā),Android在未公開之前常被傳聞為Google電話或GPhone。
為了實現(xiàn)我們的增強現(xiàn)實引擎,***還需要用到加速度傳感器數(shù)據(jù)。不過,Android應(yīng)用開發(fā)已經(jīng)為我們簡化了這些數(shù)據(jù)的收集工作。在上一篇介紹增強現(xiàn)實技術(shù)的文章中,我們的示例程序可以請求手機的方位,并調(diào)用位置管理器對象中的registerListener來檢索指南針數(shù)據(jù)。
我們也可以使用同樣的技術(shù)來請求加速度傳感器數(shù)據(jù),我們用來請求加速度傳感器數(shù)據(jù)的代碼如下所示:
- sensorMan = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE);
- sensorMan.registerListener(listener,
- sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
- SensorManager.SENSOR_DELAY_FASTEST);
我們調(diào)用了上下文對象(上述代碼中為ctx)的getSystemService方法。下面是用于方向監(jiān)聽器與加速度傳感器監(jiān)聽器的完整代碼。
- private SensorEventListener listener = new SensorEventListener(){
- public static volatile float direction = (float) 0;
- public static volatile float inclination;
- public static volatile float rollingZ = (float)0;
- public static volatile float kFilteringFactor = (float)0.05;
- public static float aboveOrBelow = (float)0;
- public void onAccuracyChanged(Sensor arg0, int arg1){}
- public void onSensorChanged(SensorEvent evt)
- {
- float vals[] = evt.values;
- if(evt.sensor.getType() == Sensor.TYPE_ORIENTATION)
- {
- float rawDirection = vals[0];
- direction =(float) ((rawDirection * kFilteringFactor) +
- (direction * (1.0 - kFilteringFactor)));
- inclination =
- (float) ((vals[2] * kFilteringFactor) +
- (inclination * (1.0 - kFilteringFactor)));
- if(aboveOrBelow > 0)
- inclinationinclination = inclination * -1;
- if(evt.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
- {
- aboveOrBelow =
- (float) ((vals[2] * kFilteringFactor) +
- (aboveOrBelow * (1.0 - kFilteringFactor)));
- }
- }
- }
- };
呵呵,這里的代碼稍微有點多,下面我們來了解一下。首先,要為監(jiān)聽器設(shè)置所有的值。這意味著,您可以隨時可以向監(jiān)聽器查詢指南針方位與手機傾角。這些值會隨著您請求的更新的類型的不同而有所變化。
然后,我們會收到傳感器信息,這時需要確定出兩種主要信息:
1. 手機指向
2. 屏幕相對于水平面的傾角
***種信息稱為方位角;第二種信息稱為傾角。為了確定這些值,***個計算任務(wù)就是過濾出攝像頭的指南針運動。這稱為翻轉(zhuǎn)過濾器(rolling filter)。變量direction用于指出手機頂部指向哪里,而非攝像頭本身指向哪里,所以我們需要進行一些校正。
第二個數(shù)學(xué)計算任務(wù)是利用翻轉(zhuǎn)過濾器對斜度進行處理,從而得到一個以度為單位的度量值,其中水平的度量值為90,向上或向下半傾的度量值為45,垂直向上或垂直向下的度量值為0。注意,當(dāng)?shù)脭?shù)為45的時候,我們無法確定手機到底是向上傾斜,還是向下傾斜。 這時加速度傳感器就派上用場了。
它能夠確定出傾角的正負,正值表示從水平線向上,復(fù)制表示從水平線向下。簡言之,我們需要的東西都能從加速度傳感器那里得到。到目前為止,打造自己增強現(xiàn)實技術(shù)引擎所需的工具我們已經(jīng)全部介紹過了,您還需要的就是少許數(shù)學(xué)知識、一些Android應(yīng)用開發(fā)和大量的精力了。
如果您對打造增強現(xiàn)實應(yīng)用程序的興趣遠勝于打造增強現(xiàn)實引擎本身的話,可以關(guān)注我當(dāng)前正在為Android開發(fā)的一個開源的增強現(xiàn)實技術(shù)引擎。為了獲得更多的進展情況,可以在Twitter上跟隨twitter.com/androidarkit。雖然我喜歡盡可能把所有的數(shù)學(xué)和繪圖代碼放在一起,并將三種信息統(tǒng)一疊放到攝像頭上。
但是這些已經(jīng)超出了本文的討論范圍。然而,本文加上上一篇文章,已經(jīng)構(gòu)成了對Android的指南針、攝像頭預(yù)覽、加速度傳感器與GPS子系統(tǒng)進行了全面的介紹。現(xiàn)在,您已經(jīng)具備了創(chuàng)建大型增強現(xiàn)實技術(shù)應(yīng)用程序所需的全部構(gòu)件。
【編輯推薦】
























