標籤:android style blog http java color
動作感應器概述
Android平台支援一些用於監視裝置動作的感應器(這樣的感應器共有5個)。其中兩個(加速感應器和陀螺儀感應器)是純的硬體感應器。另外三個(重力感應器、線性加速感應器和旋轉向量感應器)可能是硬體感應器,也可能是軟體感應器。例如,在一些Android裝置中,這些基於軟體的感應器會從加速和磁力感應器中擷取資料,但在另一些Android裝置中也可能從陀螺儀感應器中擷取資料。也就是說,同一種基於軟體的感應器在不同的Android裝置中回傳的資料可能來自不同的硬體感應器。所以基於軟體的同一種感應器在不同的裝置中可能精確度、使用範圍有所不同。大多數高端Android裝置都會有加速感應器,還有一些擁有陀螺儀感應器。
動作感應器的作用
動作感應器對於監測裝置的移動非常有用,例如,傾斜、震動、旋轉和擺動都屬於動作感應器的監測範圍。裝置的移動通常是對使用者輸入的直接反應。例如,使用者正在遊戲中飆車,或控制遊戲中的一個小球)。除此之外,裝置所處的實體環境也會反應在裝置的動作上,例如,使用者正常駕駛汽車,而這是Android裝置正安靜地躺在旁邊的座椅上,儘管裝置沒有移動,但會隨著車的行駛而不斷震動,而且裝置也會隨著汽車的移動而移動。
對於第一種情況,可以對裝置本身的相對位置進行監測。而對於第二種情況,需要考慮到裝置以外的參照系。動作感應器本身一般並不會用於監測裝置的位置,關於裝置的位置需要用其他類型的感應器進行監測,例如,磁場感應器。
動作感應器的回傳資料
所有的動作感應器都會返回三個浮點數的值(通過長度為3的數組返回),但對於不同的感應器,這三個只的意義不同。例如,對於加速感應器,會返回三個座標軸的資料。對於陀螺儀感應器,會返回三個座標軸的旋轉角速度。
加速感應器
# 裝置從左至右推動,X軸加速度為正值。# 裝置朝著自己推動,Y軸加速度為正值。
# 如果朝著天空以A m/s^2的加速度推動,那麼Z軸的加速度為A + 9.81,所以如果計算實際的加速度(抵消重力加速
度),需要減9.81。
Demo
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:id="@+id/tvAccelerometer"android:layout_width="fill_parent" android:layout_height="wrap_content" /><TextView android:id="@+id/tvMagentic" android:layout_width="fill_parent"android:layout_height="wrap_content" /><TextView android:id="@+id/tvLight" android:layout_width="fill_parent"android:layout_height="wrap_content" android:layout_marginTop="10dp" /><TextView android:id="@+id/tvOrientation"android:layout_width="fill_parent" android:layout_height="wrap_content"android:layout_marginTop="10dp" /><TextView android:id="@+id/tvSensors" android:layout_width="fill_parent"android:layout_height="wrap_content" android:layout_marginTop="10dp" /></LinearLayout>
1 package cn.eoe.motion.sensor; 2 3 import android.app.Activity; 4 import android.hardware.Sensor; 5 import android.hardware.SensorEvent; 6 import android.hardware.SensorEventListener; 7 import android.hardware.SensorManager; 8 import android.os.Bundle; 9 import android.util.Log; 10 import android.widget.TextView; 11 12 public class MotionSensorActivity extends Activity implements 13 SensorEventListener { 14 15 private TextView tvAccelerometer; 16 private SensorManager mSensorManager; 17 private float[] gravity = new float[3]; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_motion_sensor); 23 24 tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer); 25 26 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 27 28 } 29 30 @Override 31 public void onAccuracyChanged(Sensor sensor, int accuracy) { 32 33 } 34 35 @Override 36 public void onSensorChanged(SensorEvent event) { 37 switch (event.sensor.getType()) { 38 case Sensor.TYPE_ACCELEROMETER: // 加速度感應器 39 final float alpha = (float) 0.8; 40 /** 41 * event.values[0] 沿X軸加速度。 42 * event.values[1] 沿Y軸加速度。 43 * event.values[2] 沿Z軸加速度。 44 * gravity 處理重力加速度的雜音(不能能百分之百去掉)。 45 */ 46 gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 47 gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 48 gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 49 50 String accelerometer = "\n" + "X:" 51 + (event.values[0] - gravity[0]) + "\n" + "Y:" 52 + (event.values[1] - gravity[1]) + "\n" + "Z:" 53 + (event.values[2] - gravity[2]); 54 Log.d("z", String.valueOf(event.values[2] - gravity[2])); 55 tvAccelerometer.setText(accelerometer); 56 57 // 9.81m/s^2 58 break; 59 case Sensor.TYPE_GRAVITY: // 重力感應器 60 gravity[0] = event.values[0]; 61 gravity[1] = event.values[1]; 62 gravity[2] = event.values[2]; 63 break; 64 case Sensor.TYPE_PROXIMITY: // 臨近感應器 65 setTitle(String.valueOf(event.values[0])); 66 break; 67 default: 68 break; 69 } 70 71 } 72 73 protected void onResume() { 74 super.onResume(); 75 /** 76 * 註冊感應器 77 * 78 * 第二個參數,所註冊的感應器。 79 * 第三個參數,採樣頻率數值。SENSOR_DELAY_FASTEST:最快的。 80 */ 81 mSensorManager.registerListener(this, 82 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 83 SensorManager.SENSOR_DELAY_UI); // 加速度 84 mSensorManager.registerListener(this, 85 mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), 86 SensorManager.SENSOR_DELAY_FASTEST); // 重力感應器 87 mSensorManager.registerListener(this, 88 mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), 89 SensorManager.SENSOR_DELAY_UI); // 90 } 91 92 @Override 93 protected void onPause() { 94 super.onPause(); 95 // 卸載所有感應器 96 mSensorManager.unregisterListener(this); 97 98 } 99 100 }