1方向傳感器在方向傳感器中values變量的3個值都表示度數(shù),它們的含義如下:values[0]:該值表示方位,也就是手機繞著Z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。如果values[0]的值正好是這4個值,并且手機是水平放置,表示手機的正前方就是這4個方向。可以利用這個特性來實現(xiàn)電子羅盤,實例76將詳細介紹電子羅盤的實現(xiàn)過程。
values[1]:該值表示傾斜度,或手機翹起的程度。當手機繞著X軸傾斜時該值發(fā)生變化。values[1]的取值范圍是-180≤values[1]
≤180。假設將手機屏幕朝上水平放在桌子上,這時如果桌子是完全水平的,values[1]的值應該是0(由于很少有桌子是絕對水平的,因此,該值很可能不為0,但一般都是-5和5之間的某個值)。這時從手機頂部開始抬起,直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上)。在這個旋轉過程中,values[1]會在0到-180之間變化,也就是說,從手機頂部抬起時,values[1]的值會逐漸變小,直到等于-180。如果從手機底部開始抬起,直到將手機沿X軸旋轉180度,這時values[1]會在0到180之間變化。也就是values[1]的值會逐漸增大,直到等于180??梢岳胿alues[1]和下面要介紹的values[2]來測量桌子等物體的傾斜度。
values[2]:表示手機沿著Y軸的滾動角度。取值范圍是-90≤values[2]≤90。假設將手機屏幕朝上水平放在桌面上,這時如果桌面是平的,values[2]的值應為0。將手機左側逐漸抬起時,values[2]的值逐漸變小,直到手機垂直于桌面放置,這時values[2]的值是-90。將手機右側逐漸抬起時,values[2]的值逐漸增大,直到手機垂直于桌面放置,這時values[2]的值是90。在垂直位置時繼續(xù)向右或向左滾動,values[2]的值會繼續(xù)在-90至90之間變化。
2加速傳感器該傳感器的values變量的3個元素值分別表示X、Y、Z軸的加速值。例如,水平放在桌面上的手機從左側向右側移動,values[0]為負值;從右向左移動,values[0]為正值。讀者可以通過本節(jié)的例子來體會加速傳感器中的值的變化。要想使用相應的傳感器,僅實現(xiàn)SensorEventListener接口是不夠的,還需要使用下面的代碼來注冊相應的傳感器。
// 獲得傳感器管理器
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
// 注冊方向傳感器
sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);
如果想注冊其他的傳感器,可以改變getDefaultSensor方法的第1個參數(shù)值,例如,注冊加速傳感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor類中還定義了很多傳感器常量,但要根據(jù)手機中實際的硬件配置來注冊傳感器。如果手機中沒有相應的傳感器硬件,就算注冊了相應的傳感器也不起任何作用。getDefaultSensor方法的第2個參數(shù)表示獲得傳感器數(shù)據(jù)的速度。SensorManager.SENSOR_DELAY_ FASTEST表示盡可能快地獲得傳感器數(shù)據(jù)。除了該值以外,還可以設置3個獲得傳感器數(shù)據(jù)的速度值,這些值如下:SensorManager.SENSOR_DELAY_NORMAL:默認的獲得傳感器數(shù)據(jù)的速度。SensorManager.SENSOR_DELAY_GAME:如果利用傳感器開發(fā)游戲,建議使用該值。SensorManager.SENSOR_DELAY_UI:如果使用傳感器更新UI中的數(shù)據(jù),建議使用該值。
3其他傳感器其他傳感器在前面幾節(jié)介紹了加速度傳感器、重力傳感器、光線傳感器、陀螺儀傳感器以及方向傳感器。除了這些傳感器外,Android SDK還支持如下的幾種傳感器。關于這些傳感器的使用方法以及與這些傳感器相關的常量、方法,讀者可以參閱官方文檔。
近程傳感器(Sensor.TYPE_PROXIMITY)線性加速度傳感器(Sensor.TYPE_LINEAR_ACCELERATION)旋轉向量傳感器(Sensor.TYPE_ROTATION_VECTOR)磁場傳感器(Sensor.TYPE_MAGNETIC_FIELD)壓力傳感器(Sensor.TYPE_PRESSURE)溫度傳感器(Sensor.TYPE_TEMPERATURE)
雖然AndroidSDK定義了十多種傳感器,但并不是每一部手機都完全支持這些傳感器。例如,Google Nexus S支持其中的9種傳感器(不支持壓力和溫度傳感器),而HTC G7只支持其中的5種傳感器。如果使用了手機不支持的傳感器,一般不會拋出異常,但也無法獲得傳感器傳回的數(shù)據(jù)。讀者在使用傳感器時最好先判斷當前的手機是否支持所使用的傳感器。