一、感測器(Sensor)
現今大部分的Android手機都有內建感測器,功用有測量動作、方向和環境狀況等等,以下將感測器分為三大類:
- 動作感測器(Motion sensors): 三方向加速和旋轉的測量
- 加速規(accelerometers)
- 重力感測器(gravity sensors)
- 陀螺儀(gyroscopes)
- 旋轉向量感測器(rotation vector sensors)
- 環境感測器(Environmental sensors): 溫度、氣壓、光照的測量
- 氣壓計(barometer)
- 光度計(photometers)
- 溫度計(thermometer)
- 位置感測器(Position sensors): 物理位置的測量
- 方向感測器(orientation sensors)
- 磁力計(magnetometers)
二、感測器框架(Sensor Framework)
使用Android感測器框架可以取得感測器及感測器原始數據,框架包含以下類別(class)和接口(interface):
(Q.類別與介面有什麼差別?)
- SensorManager: 感測器服務的實例。提供各種方法來訪問和列出感測器、註冊和註銷感測器事件偵聽器以及獲取方向信息。此類還提供了幾個感測器常量,用於報告感測器精度、設置數據採集速率和校準感測器。
- Sensor: 傳感器的實例
- SensorEvent: 感測器事件對象,該對象提供有關感測器事件的信息
- SensorEventListener: 可以使用此接口創建兩個回調方法,在感測器值更改或感測器精度更改時接收通知
下圖為感測器程式的基本架構
三、JAVA與C++的繼承
JAVA與C++有幾個重要的差異,其中之一就是JAVA不支援多重繼承,因為C++為了多重繼承搞了一堆機制有些複雜(如虛擬繼承 ...),所以JAVA只能單一繼承一個類別(class)但可以實現多個介面(interface)
上面程式碼中第一行就是啦,extends後面跟著的是父類別,implements後面跟著的是interface,多於一個interface要實現時,interface間用逗號分開即可
extends與implements間那個逗號也可以不要
四、實作1 – 感測器數值讀取
取出加速規(accelerometers)、陀螺儀(gyroscopes)和磁力計(magnetometers)的資料並放到TextView顯示
此三種感測器都各有x、y和z三方向。三方向如下圖所示:
- 新增專案,稱設為: CH3_學號_SensorActivity
- 顯示介面的編輯(activity_main.xml)
新增多個TextView顯示感測器名稱以及xyz軸數值
以下為參考程式,每個元件的id需要不一樣
https://imgur.com/a/aFd8biZ
- 在主程式取得TextView元件(MainActivity.java)
- 完成Sensor基本架構
- 註冊監聽事件以及取消監聽
避免程式沒有在畫面上的時候持續吃掉電量以及效能,需要在onPause()時取消監聽
- 顯示數值於TextView
- 結果
- 參考程式
https://imgur.com/a/pbEtU8o
五、實作2 – 水平儀
利用加速規的xyz加速度計算出pitch及roll來製作水平儀
- 新增專案,名稱設為: CH3_學號_SpiritLevel
- 鎖定螢幕方向(AndroidManifest.xml)
- 顯示介面的編輯(activity_main.xml)
新增多個TextView顯示加速規數值以及計算的pitch & roll
新增兩個ImageView,一個固定中央一個移動響應用,透明度設為50%以便觀察重疊
以下為參考程式,布局為RelativeLayout
https://imgur.com/a/cs1rfm3
- 同實作1取得元件以及完成基本架構
- 新增計算pitch & roll的函式
- 新增移動圖片的函式
以pitch & roll作為因子去移動圖片的x, y座標
公式記得考慮圖片寬高以及超出布局邊緣的情況以下為參考程式 - 顯示數值於TextView及移動圖片
- 結果
- 參考程式
https://imgur.com/a/PrNuZp2
參考