作者ivm
參考文章:http://blog.csdn.net/wenzhi20102321/article/details/53282313
Demo?下載地址https://github.com/changer0/WeiChatShake
引言:在開發(fā)時,搖一搖這個需求是必不可少的,一般開發(fā)是很少用到的傳感器的,今天就為大家掃掃盲,最后在一起做一個搖一搖的Demo?
傳感器的分類:
一、動作傳感器:
加速度傳感器
陀螺儀傳感器
重力傳感器
線性加速傳感器
旋轉向量傳感器
二、位置傳感器:
臨近物體傳感器
方向傳感器
磁場傳感器
三、環(huán)境傳感器
溫度傳感器
光傳感器
壓力傳感器
四、新增傳感器
心率傳感器
哇,是不是很多啊,其中有些傳感器還是挺常用的,比如方向傳感器,重力傳感器
那傳感器到底怎么實現(xiàn)呢,它難不難呢??
首先我很負責的說,它功能實現(xiàn)不難,我們會很容易的就使用它,但是高級傳感器的應用還是有難度的
如何實現(xiàn)傳感器?
1.聲明Sensor,SensorManager
2.在?onCreate 初始化SensorManager ,Sensor
Sensor 對象可以獲取信息的方法有如下:
1. getMaximumRange() 最大取值范圍
2. getName() 設備名稱
3. getPower() 功率
4. getResolution() 精度
5. getType() 傳感器類型
6. getVentor() 設備供應商
7. getVersion() 設備版本號
3.傳感器都是需要注冊和解除注冊的,一般我們在onResume , onPause 注冊 和解除注冊
注冊時的參數(shù)含義:
第一個參數(shù)為傳感器監(jiān)聽
第二個參數(shù)為當前注冊的傳感器
第三個參數(shù)是延遲時間的精密度,
精密度可選擇的值
1.SensorManager.SENSOR_DELAY_FASTEST 0ms
2.SensorManager.SENSOR_DELAY_GAME 20ms
3.SensorManager.SENSOR_DELAY_UI 60ms
4.SensorManager.SENSOR_DELAY_NORMAL 200ms
注意
SenSorEventListener 可以在Activity 實現(xiàn),也可以內部類實現(xiàn),但是都會有這兩個方法
onSensorChanged 當傳感器數(shù)值發(fā)生改變時調用,onAccuracyChanged 當傳感器的精度發(fā)生變化時調用。其中onSensorChanged 是我們常常改寫的方法。它提供一個SensorEvent 對象通過這個對象我可以獲取很多數(shù)據(jù)。
注:不同的傳感器的區(qū)別在于
1.Sensor 實例化時
2.onSensorChanged,onAccuracyChanged 這兩個回調方法會有些區(qū)別。
不同傳感器的區(qū)別:
1.動作傳感器的回傳數(shù)據(jù)
所有的動作傳感器都會返回三個浮點數(shù)的值(通過長度為3的數(shù)組返回),但對于不同的傳感器,這三個只的意義不同。例如,對于加速傳感器,會返回三個坐標軸的數(shù)據(jù)[。對于陀螺儀傳感器,會返回三個坐標軸的旋轉角速度。
應用:動作傳感器 搖一搖
2.方向傳感器
方向傳感器有三個方向的屬性值。
1)SensorEvent.values[0]: 繞著Z軸旋轉的角度。如果Y軸(正常拿手機的方向)正對著北方,該值是0,如果Y軸指向南 方,改值是180,Y軸指向東方,該值是90,如果Y軸指向西方,該值是270。
2)SensorEvent.values[1]: 繞著X軸旋轉的度數(shù)。當從Z軸正方向朝向Y軸正方向,改值為正值。反之,為負值。該值在 180至-180之間變動。
3)ensorEvent.values[2]:繞著Y軸旋轉的度數(shù)。從Z軸正方向朝向X軸正方向,改值為正值。反之,為負值。該值在180至-180之間變動。 應用:方向傳感器_指南針
3.磁場傳感器(這個傳感器一般開發(fā)不會用到! )
SensorEvent.values[0]: 沿著X軸的磁(μT,millitesla) SensorEvent.values[1]: 沿著Y軸的磁(μT,millitesla) SensorEvent.values[2]: 沿著Z軸的磁(μT,millitesla)
4.鄰近傳感器
這里只返回一個參數(shù) SensorEvent.values[0]:手機正面距離鄰近物理的距離(CM)
應用:手機接電話時屏幕熄屏
5.光線傳感器的一些值的標準
最強的光線強度(估計只有沙漠地帶才能達到這個值)
public static final float LIGHT_SUNLIGHT_MAX = 120000.0f;
萬里無云時陽光直射的強度
public static final float LIGHT_SUNLIGHT = 110000.0f;
有陽光,但被云彩抵消了部分光線時的強度
public static final float LIGHT_SHADE = 20000.0f; 多云時的光線強度
public static final float LIGHT_OVERCAST = 10000.0f;
太陽剛剛升起時(日出)的光線強度
public static final float LIGHT_SUNRISE = 400.0f;
在陰雨天,沒有太陽時的光線強度
public static final float LIGHT_CLOUDY = 100.0f;
夜晚有月亮時的光線強度
public static final float LIGHT_FULLMOON = 0.25f;
夜晚沒有月亮時的光線強度(當然,也不能有路燈,就是漆黑一片)
public static final float LIGHT_NO_MOON = 0.001f;
最后我們來一個完整的Demo
大體邏輯:獲取加速度傳感器,在搖的時候handler 發(fā)一次消息 ,(震動一次,執(zhí)行動畫圖片分開,分開時顯示橫線,聲音響),看搖一搖的動畫多長(假設500ms),在500ms 后在發(fā)一次消息,(震動一次,執(zhí)行動畫,圖片回來,隱藏橫線)
1.準備階段
在加上一段 搖一搖的聲音
2.添加權限
3.初始化
4.重寫Sensor 回調方法(關鍵)
5.handler 實現(xiàn)
6.動畫實現(xiàn)