<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                將你的手機指向天空,谷歌星空地圖會顯示出你正在觀看的星群;傾斜手機,可以控制你的游戲;帶著你的手機去散步,一款“面包渣兒”應用將記錄下你的途經的路線。所有這些應用之所以能夠實現,都是因為你所攜帶的移動設備裝備了高科技的傳感器,可以探測到位置、方向以及加速度。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404939ae9b.png) 本章將再次討論App Inventor的位置傳感器、方向傳感器以及加速度傳感器等組件,其中將學習全球定位系統(GPS)、方向測量(如傾斜、旋轉及搖晃)以及與處理加速度讀數相關的數學知識。 ## **創建位置感知應用** 在智能手機流行之前,計算僅限于桌面電腦。雖然便攜式電腦算是移動設備,但與我們今天隨身攜帶的微型設備相比,不可同日而語。計算已經擺脫了實驗室及辦公室,在地球上隨時隨地都在發生。 對計算的普遍性產生深刻影響的是一項新的、有趣的數據,它存在于上述的所有應用中,即:當前的位置信息。當人們在世界各地游走時掌握他們的行蹤,這件事影響深遠,它既有可能對我們的生活產生極大的幫助,但同時也存在侵犯隱私及損害人權的可能。 在“安卓,我的車在哪”的應用中(第7章)就是一個有益的位置感知應用的例子,讓我們可以記住之前的地點,以便稍后還能找回來。這是一個個人應用——位置信息就保存在自己的手機數據庫中。 同樣的理念也適用于群組。例如,一個徒步旅行者小組可能希望在荒野中查看每個組員的去向,或者一個商務團隊可能希望在一個大型會議上尋找自己的伙伴。這類應用已經出現在市場上,兩個典型的應用就是“谷歌縱橫(Latitude)”([www.google.com/latitude](http://www.google.com/latitude))以及Facebook的“簽到(Place)”([www.facebook.com/places](http://www.facebook.com/places))。由于公眾對隱私的擔憂,這些應用一經面世便備受爭議。 另一類位置感知應用使用了增強現實工具。這類應用利用位置及手機的方向,在自然信息基礎上,提供增強的疊加信息。因此當你用手機指向一棟建筑物時,你會看到它在房地產市場上的價格,或者你在植物園中欣賞異國花卉時,某個應用會告訴你這株植物的品種。這類應用的早期產品包括世界瀏覽器(Wikitude——一款增強現實的實景地圖導航應用)、手機實景瀏覽器(Layar——第一款手機版的增強現實瀏覽器)以及谷歌星空地圖。 世界瀏覽器甚至可以讓用戶通過網站[http://wikitude.me](http://wikitude.me/)在移動云上添加數據。在網站上,選定地圖并標注上你的個人信息,稍后,當你或其他用戶在這個位置使用該移動應用時,你發布的信息就會顯示出來。 ## **GPS** 創建一個位置感知應用,首先需要了解全球定位系統(GPS)的工作原理。GPS數據來自美國政府所保有的衛星系統,只要在視野開闊地帶,至少能看到三顆衛星,你的手機就能獲得讀數。一份GPS讀數包括位置的緯度、經度及海拔高度。緯度表示與赤道的距離,赤道以北為正值,以南為負值,范圍從-90至90.如23-1顯示了厄瓜多爾基多附近的谷歌地圖,圖中的緯度為-0.01,表示在赤道偏南一點點。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404994d600.png) **圖 23-1 位于赤道上的厄瓜多爾首都基多** 經度是距離本初子午線(零度經線)向東或向西偏離的距離,向東為正值,西為負值,零度經線穿過的最知名的地點就是格林威治,倫敦附近的一座小鎮,皇家天文臺的所在地。圖23-2中的地圖標出了格林威治,它的經度為0.0。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a3d909d.png) **圖 23-2 格林威治的皇家天文臺沿本初子午線射出一道光柱** 經度值從-180到180,圖23-3顯示了俄羅斯境內的一點,非常靠近阿拉斯加,它的經度為180.0,這個點可以理解為以格林威治(經度為0.0)為起點繞地球半圈所到達的位置。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a497df7.png) **圖 23-3 在俄羅斯與阿拉斯加邊境附近的一點,經度為180** ## **用App Inventor感知位置** App Inventor為訪問GPS信息提供了LocationSensor(位置傳感器)組件,該組件具有Latitude(緯度)、Longitude(經度)及Altitude(海拔高度)三個屬性,此外它可以與谷歌地圖通信,因此還可以獲得當前街道地址的信息。 圖23-4中的LocationSensor. LocationChanged是位置傳感器組件LocationSensor最關鍵的事件處理程序。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a55d7e7.png) **圖 23-4 LocationSensor1.LocationChanged事件處理程序** 兩種情況可以觸發LocationChanged事件:傳感器第一次收到讀數時,以及當位置發生一定變化后收到新的讀數時。其中第一次讀數通常會延遲幾秒鐘,有時也會一直沒有讀數。例如,如果你在室內而且沒有連接WiFi,設備將無法獲得讀數。手機中也有相關的設置,可以為了省電而關閉了GPS,這是無法獲得讀數的另一個可能的原因。除了這些原因,在LocationSensor.LocationChanged事件被觸發之前,不能排除LocationSensor做了不合理的屬性設置。 處理這種無法感知位置的情況,有一個方法是創建一個變量lastKnownLocation,并將其初始化為“未知”,然后讓LocationSensor.LocationChanged事件處理程序來修改變量的值,如圖23-5所示。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a5c51db.png) **圖 23-5 變量lastKnownLocation的值會隨位置的改變而改變** 通過編寫以上事件處理程序,在第一次獲得讀數之前顯示“未知”,這樣就可以始終顯示當前位置,或將位置信息保存到數據庫中。這一策略在第4章“開車不發短信”中使用過,即,在自動回復的短信中加入位置信息:“未知”或最后一次獲得的讀數。 也可以使用LocationSensor.HasLongitudeLatitude塊,直接詢問傳感器是否具有讀數。如圖23-6所示。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a64ddb4.png) **圖 23-6 用HasLongitudeLatitude塊測試傳感器是否具有讀數** ## **檢查邊界** 事件LocationChanged的一種通常的用法是檢查設備是否在某個邊界之內,或在某個設定區域內。例如,看圖23-7中的代碼,每次當傳感器獲得的讀數顯示某人離開零度經線的距離超過0.1度時,讓手機產生震動。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a6db259.png) **圖 23-7 如果讀書遠離了零度經線,則手機發出震動** 這種邊界檢查功能可以有很多應用,例如對于假釋犯,如果他們離開家的距離接近規定的合法距離時,應用會發出警告;或者對教師及家長來說,可以監控孩子是否離開了操場。如果你想看到更為復雜的例子,參見第18章中關于條件塊的討論。 ## **位置信息的來源:GPS, WiFi以及基站編碼** 有幾種方法可以確定Android設備的位置,最精確的方法是通過衛星,美國政府維護的組成GPS系統的衛星,可精確到數米。但是如果在室內,并有高樓或其他物體遮擋,則無法獲得讀數。需要在開闊地區并且系統中至少要有三顆衛星。 如果無法使用GPS,或者用戶的設備禁用了這一功能,也可以通過無線網絡獲得位置信息。設備需要在WiFi路由器附近,當然,你獲得的經緯度讀數是這臺WiFi設備的位置信息。 判斷設備位置的第三種方式是通過移動網絡的基站編碼(Cell ID),基站編碼對手機位置的判斷來源于手機與附近基站之間通信信號的強弱,這種方式通常不夠精確,除非你周圍有很多個基站。不過這種方式與GPS或WiFi連接相比,是最省電的。 ## **使用方向傳感器** 游戲中會用到方向傳感器(OrientationSensor),用戶通過傾斜設備來控制物體的運動。方向傳感器也可以用作指南針,確定手機所指的方向。 方向傳感器有五個屬性,除了航空工程師外,大多數人都不熟悉這些參數: 滾動參數Roll(左-右):當設備水平時,Roll的值為0°,當設備向左傾斜時,增加到90°,而當設備向右傾斜時,減少到-90°。 傾斜參數Pitch(前-后):當設備水平時,Pitch為0°,當設備頭朝下時,Pitch值增加到90°,當設備翻轉至面朝下時,增加到180°。同樣,當設備的下端朝下時,Pitch值減小到-90°,當繼續翻轉至面朝下時,Pitch值為-180°。 方位角參數Azimuth(指南針):當設備頂端指向正北時,Azimuth的值為0°;指正東時,值為90°;指正南時,值為180°;指正西時,值為270°。 強度參數Magnitude(滾動球的速度):Magnitude參數的返回值在0-1之間,表示設備的傾斜程度。它的值表示在設備表面滾動的球體所能施加的力的大小。 角度參數Angle(滾動球的角度):Angle返回設備傾斜的方向。即,在設備表面滾動的球體所能施加的力的方向。 方向傳感器同樣提供了方向變化事件,每次當方向發生變化時,會觸發該事件。為了進一步探索這些屬性的意義,寫一個應用來描述這些屬性如何隨設備的傾斜而變化。在用戶界面中添加五個方向label,另外五個標簽用于顯示前面所述的屬性當前的值。如圖23-8所示添加相關的塊。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a7653c6.png) **圖 23-8 顯示方向傳感器數據的代碼塊** ### **使用滾動參數Roll** 現在通過用戶對設備的傾斜,來實現圖像在屏幕上的左右移動,就像在射擊或賽車類游戲中那樣。拖入一個Canvas組件,寬度設為“Fill parent”,高度為200像素。然后向Canvas上添加一個ImageSprite組件,并在Canvas下方添加一個名為RollLabel的Label,來顯示Roll屬性值。如圖23-9所示。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a7ea1b9.png) **圖 23-9 滾動操作如何控制圖像移動的用戶界面** 方向傳感器OrientationSensor的Roll屬性表示手機的傾斜方向:向左或向右(即,如果你正握手機并稍向左傾斜,獲得的讀數為正值;反之向右傾斜則為負值)。因此,利用圖23-10中的事件處理程序,用戶可以實現對運動的控制。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404a861788.png) **圖 23-10 利用OrientionChanged事件來響應Roll屬性的變化** 圖中的乘法塊讓roll屬性乘以-1,因為向左傾斜時,roll的值為正,但我們希望物體向左移動(因此x坐標的值變小)。要了解動畫應用中的坐標系統的工作原理,參見第17章。 需要注意的是,這段程序是針對縱向模式(正握手機時)編寫的,而非橫向。事實上,當你過度地傾斜手機時,屏幕會自動轉成橫向模式,而圖像則被卡在屏幕的左邊。這是因為當設備向一側傾斜時,如向左傾斜時,獲得的roll屬性的讀數一直是正值,因此圖像的x坐標值也一直在變小,如圖23-10所示。 如果App Inventor提供了解決上述問題的方法,應該是(1)在手機上取消屏幕的自動旋轉功能;或者(2)區分手機的縱橫模式,針對不同模式給出不同的物體運動公式。App Inventor未來會提供這樣的支持,但現在你還需要向用戶說明應用的運行方式。 ### **控制運動的方向及速度** 前面的例子中圖像可以左右移動,如果想實現任意方向的運動,可以使用OrientationSensor的Angle(角度)及Magnitude(強度)屬性,這正是第5章的游戲中讓瓢蟲移動的屬性。 在圖23-11中的塊是一個測試程序,用戶可以通過傾斜設備來實現任意方向的運動(需要兩個Label及一個ImageSprite). ![{%}](https://box.kancloud.cn/2015-08-31_55e404adc53af.png) **圖 23-11 用角度和強度來實現移動** 試試看,強度屬性的值介于0至1之間,代表設備的傾斜程度,在這段測試程序蒸南瓜,傾斜的程度越大,圖像移動的越快。 ### **手機用作指南針** 指南針應用,以及像谷歌星空這樣的應用,需要知道手機所指的方向(東南西北),谷歌星空就是根據手機的指向,將方向信息疊加在星座信息上。 屬性Azimuth可以用于表示方向。Azimuth的取值介于0°至360°之間:正北為0,正東為90,正南為180,正西為270。因此當Azimuth值為45時,意味著手機指向東北,135時指向東南,225時指向西南,315時指向西北。 圖23-12中的塊創建了一個簡易的指南針,可以用文字顯示手機所指的方向(如西北)。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404b0c045d.png) **圖 23-12 編程實現一個簡易的指南針** 你會發現,程序只能顯示四個方向之中的一個:東南、東北、西南、西北。你可以挑戰一下自己,看能否修改程序,當手機的指向在某個范圍內時,顯示四個正方向(正北、正南、正東、正西)。 ## **加速度傳感器** 加速度是速度隨時間的變化率,如果你踩下油門,車會加速——車速會以一定的比率增加。 在Android手機中內置了加速度計,用于測量加速度,但測量的參照系不是靜止的手機,而是自由下落中的手機:如果你讓手機下落,它所記錄的加速度讀數為0。一句話,讀數與重力有關。 如果感興趣相關的物理知識,可以去查閱相關的書籍,但本小節中,我們將充分討論加速度計,為你建立一個良好的開端,并仔細分析一個能夠拯救生命的應用。 ### **響應設備的搖晃** 如果學習過第1章(Hello貓咪),那么你已經使用過加速度傳感器了:使用Accelerometer.Shaking事件,當手機搖晃時,設備發出貓叫聲。如圖23-13所示的塊。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404b13ff71.png) **圖 23-13 手機搖晃時發出聲音** ### **使用加速度傳感器的讀數** 像其他傳感器一樣,加速度計也具備偵測讀數變化的事件:AccelerometerSensor.AccelerationChanged,這個事件有三個參數,對應加速度在三個維度上的分量: xAccel:當設備向右傾斜時,其值為正(即,左側的邊緣在上升);當設備向左傾斜時,其值為負(設備右側邊緣上升)。 yAccel:當設備的底部上升時,其值為正;當設備頂部上升時,其值為負。 zAccel:設備的顯示屏朝上時,其值為正;顯示屏朝下時,其值為負。 ### **檢測自由落體** 我們知道,如果加速度的讀數為0,那么設備一定在做自由落體運動,基于這一認識,我們可以在AccelerometerSensor.AccelerationChanged事件中,通過檢測讀數來模擬自由落體事件。這些代碼經過反復測試,可以用于老年人的自動求救:一旦偵測到發生跌倒,就會自動向外發送短信。 圖23-14中顯示了這個應用使用的塊,當發生自由落體運動時,給出一個簡單的報告(用戶可以點擊“重置”按鈕進行再次檢測)。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404b1a4338.png) **圖 23-14 當自由落體發生時進行報告** 每當傳感器獲得讀數,這些塊都要在x、y、z三個維度上進行檢查,看是否這些值接近于0(即它們的絕對值小于1)。如果三者都接近于0,應用將改變label的屬性,來表示設備正處于自由落體狀態。當用戶點擊“重置”按鈕時,顯示狀態的label又被重新設為初始值(“沒發生跌落事件”)。 如果你想試用這個應用,可以從這里下載:[http://examples.oreilly.com/0636920016632](http://examples.oreilly.com/0636920016632)。 ### **用校準值測定加速度** 加速度傳感器的讀數用自由落體時的狀態進行校準。如果你想測量設備平放在桌上時的加速度的相對值,則必須與標準讀數進行校準。校準的意思是與標準值進行核對、判定或檢測;在本例中,標準值就是將設備平放在桌上時的讀數。 校準需要用戶將設備平放在桌面上,然后點擊“校準”按鈕,這時 應用將讀出平面上的加速度值,這些值會在稍后的AccelerationChanged事件中用來判斷新讀數的偏差,并顯示設備是否在某個方向上進行了快速的移動。 圖23-15中顯示了一個樣板應用,讓用戶校準讀數并測試加速度。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404b227fb7.png) **圖 23-15 校準加速度的讀數** 可以在此下載并安裝這一應用:[http://examples.oreilly.com/0636920016632/](http://examples.oreilly.com/0636920016632/)。運行應用,并將手機放在桌上,點擊校準按鈕,將顯示“在平臺上的讀數”,此時如果緩慢地拿起手機,“顯著變化”區域的讀數不會變化(顯示“無”);但如果你快速提起手機,則Z-變化將由“無”變為“有”,如圖23-15所示。同樣,如果快速沿桌面移動手機,則X或Y也會有顯著加速。在圖23-16中顯示了設置校準初始值的塊。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404b297f36.png) **圖 23-16 校準程序的初始設置** 這些塊從加速度傳感器中獲取讀數,并顯示在三個label中:XCalibLabel、YCalibLabel及ZCalibLabel,并初始化另外三個顯示加速度變化結果的label。 當手機水平放置時,加速度計的zAccel讀數大約為9.8,而xAccel及yAccel讀數約等于0,這些值的偏差表明了加速度計的精確度。獲得了基準讀數之后,可以通過比較新的測量值與基準值之間的偏差,偵測到手機在x、y或z方向的加速度變化(這種方法與第18章中的邊界檢測程序相類似)。圖23-17顯示了這一方法的具體實現。 ![{%}](https://box.kancloud.cn/2015-08-31_55e404b315a6c.png) **圖 23-17 用基準值來偵測加速度變化** 當設備移動時,將觸發這段程序。通過測量新的加速度值,并與靜止時的基準值進行比較,從而判斷加速度之是否產生了顯著變化。假設ZCalib.Text記錄的基準值為9.0,此時如果緩慢地拿起手機,那么新的讀數將保持在9左右,并且不會報告有顯著變化;但如果是快速地拿起手機,則讀數會明顯增大,此時程序將報告加速度“有”顯著變化。 ## **小結** 傳感器是移動應用中最富魅力的部分,因為它們實現了用戶與環境之間實實在在的交互。無論是用戶體驗,還是應用開發,移動計算為我們帶來了無限的商機。不過依然要精心地構思一個應用,來決定何時、何地以及如何使用這些傳感器。很多人會擔心隱私問題,如果應用中涉及到個人的敏感信息,他們可能會放棄使用。盡管如此,在游戲、社交網絡、旅行以及其他眾多的選項中,仍然有無限多種可能開發出有積極意義的應用來。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看