传感器的使用
传感器类型:方向、加速度(重力)、光线、磁场、距离(临近性)、温度等。
方向传感器: 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 }