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