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