傳感器類型:方向、加速度(重力)、光線、磁場、距離(臨近性)、溫度等。
方向傳感器: Sensor.TYPE_ORIENTATION
加速度(重力)傳感器: Sensor.TYPE_ACCELEROMETER
光線傳感器: Sensor.TYPE_LIGHT
磁場傳感器: Sensor.TYPE_MAGNETIC_FIELD
距離(臨近性)傳感器: Sensor.TYPE_PROXIMITY
溫度傳感器: Sensor.TYPE_TEMPERATURE
//獲取某種類型的感應器
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注冊監聽,獲取傳感器變化值
sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);
上面第三個參數為采樣率:最快、游戲、普通、用戶界面。當應用程序請求特定的采樣率時,其實只是對傳感器子系統的一個建議,不保證特定的采樣率可用。
最快: SensorManager.SENSOR_DELAY_FASTEST
最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗,由於傳遞的為原始數據,算法不處理好將會影響游戲邏輯和UI的性能。
游戲: SensorManager.SENSOR_DELAY_GAME
游戲延遲,一般絕大多數的實時性較高的游戲都使用該級別。
普通: SensorManager.SENSOR_DELAY_NORMAL
標准延遲,對於一般的益智類或EASY級別的游戲可以使用,但過低的采樣率可能對一些賽車類游戲有跳幀現象。
用戶界面: SensorManager.SENSOR_DELAY_UI
一般對於屏幕方向自動旋轉使用,相對節省電能和邏輯處理,一般游戲開發中我們不使用。
指南針Demo:
1 package com.android.hzy.sensor; 2 3 import android.app.Activity; 4 import android.content.Context; 5 import android.hardware.Sensor; 6 import android.hardware.SensorEvent; 7 import android.hardware.SensorEventListener; 8 import android.hardware.SensorManager; 9 import android.os.Bundle; 10 import android.view.animation.Animation; 11 import android.view.animation.RotateAnimation; 12 import android.widget.ImageView; 13 14 public class MainActivity extends Activity { 15 16 private SensorManager sensorManager; 17 private Sensor sensor; 18 private MySensorEventListener listener; 19 private ImageView iv; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 26 iv = (ImageView) findViewById(R.id.iv); 27 iv.setKeepScreenOn(true);// 保持屏幕的高亮 28 29 // 得到sensor管理器 30 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 31 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);// 得到方向傳感器 32 33 listener = new MySensorEventListener(); 34 35 } 36 37 /** 38 * 第三個參數為采樣率:最快、游戲、普通、用戶界面。當應用程序請求特定的采樣率時,其實只是對傳感器子系統的一個建議,不保證特定的采樣率可用。 39 最快: SensorManager.SENSOR_DELAY_FASTEST 40 最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗,由於傳遞的為原始數據,算法不處理好將會影響游戲邏輯和UI的性能。 41 游戲: SensorManager.SENSOR_DELAY_GAME 42 游戲延遲,一般絕大多數的實時性較高的游戲都使用該級別。 43 普通: SensorManager.SENSOR_DELAY_NORMAL 44 標准延遲,對於一般的益智類或EASY級別的游戲可以使用,但過低的采樣率可能對一些賽車類游戲有跳幀現象。 45 用戶界面: SensorManager.SENSOR_DELAY_UI 46 */ 47 48 @Override 49 protected void onResume() { 50 // TODO Auto-generated method stub 51 super.onResume(); 52 // 注冊sensor監聽 傳感器非常的消耗性能,顯示在前台的時候再注冊監聽 53 sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME); 54 } 55 56 @Override 57 protected void onPause() { 58 // TODO Auto-generated method stub 59 super.onPause(); 60 // 取消監聽 61 sensorManager.unregisterListener(listener); 62 } 63 64 /** 65 * 傳感器事件監聽 66 * @author Administrator 67 * 68 */ 69 private final class MySensorEventListener implements SensorEventListener{ 70 71 private float predegree = 0; 72 73 @Override 74 public void onSensorChanged(SensorEvent event) { 75 // TODO Auto-generated method stub 76 float x = event.values[SensorManager.DATA_X]; 77 float y = event.values[SensorManager.DATA_Y]; 78 float z = event.values[SensorManager.DATA_Z]; 79 80 // 指南針只需用到X軸 81 RotateAnimation animation = new RotateAnimation(-predegree, x, // 82 Animation.RELATIVE_TO_SELF, 0.5f, // 83 Animation.RELATIVE_TO_SELF, 0.5f); 84 85 animation.setDuration(200); 86 iv.startAnimation(animation); 87 88 predegree = x; 89 } 90 91 @Override 92 public void onAccuracyChanged(Sensor sensor, int accuracy) { 93 // TODO Auto-generated method stub 94 95 } 96 97 } 98 99 }