有关安卓加速计的onSensorChanged的信息

时间:2011-04-21 11:10:37

标签: android

我正在尝试在Android平台上编写动作感应游戏。我将整个运动检测算法包含在onSensorChanged()函数中。问题是该函数根据输入执行不同的时间。我对函数如何执行和调用有一些疑问: -

1)如果我的函数执行了很长时间,那么2 onSensorChanged事件会被调用还是只调用最新的?

2)onSensorChanged函数是否在活动线程以外的其他线程上运行?

3)onSensorcChanged函数的多个实例是否在不同的线程上运行?变量访问是否有任何类型的同步?

4)有人能指出我在哪里可以找到有关onSensorChanged()或相关信息的详细信息吗?

5)有没有什么办法我可以先玩游戏一段时间,然后看看这些值是如何改变的,以及这些函数的执行方式有何不同?

1 个答案:

答案 0 :(得分:6)

如果您可以提供您正在使用的传感器类型,那将会更有用。我假设它是Sensor.TYPE_ORIENTATION

  

1)如果我的函数执行了很长时间,那么2 onSensorChanged事件会被调用还是只调用最新的?

onSensorChanged方法提供了一个事件对象(values参数),特定传感器的值附加到该参数上。对于Sensor.TYPE_ORIENTATIONevent.values[0]是方位角,event.values[1]是Pitch,而event.values[2]是Roll。 Read the Android Developers SensorEvent page要更好地理解这一点。上述值会很快更新,只有您处理这些值更改才能确定将使用哪个值更新。例如,您可以根据事件值的更改方式不断更新视图。

  

2)onSensorChanged函数是否在活动线程以外的其他线程上运行?

它运行在一个不同的线程上,该线程依赖于它附加到的活动(实现SensorEventListener接口的活动或包含从{{1}创建的匿名内部类实例化的对象} object)。

  

3)onSensorcChanged函数的多个实例是否在不同的线程上运行?变量访问是否有任何类型的同步?

我对此不太确定,但我想他们会在更新时同步SensorEventListener对象。是的,实现event接口的多个类实例可以单独运行。

  

4)有人能指出我在哪里可以找到有关onSensorChanged()或相关信息的详细信息吗?

  

5)有没有什么办法我可以先玩游戏一段时间,然后看看这些值是如何改变的,以及这些函数的执行方式有何不同?

您使用的是图形还是布局?如果你正在使用图形,

活动类:

SensorEventListener

查看课程

public class YourActivity extends Activity {
  MyView _view;
  int sensorAccuracy;
  SensorManager sensorManager;
  SensorEventListener sensorListener = new SensorEventListener() {
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
      sensorAccuracy = accuracy;
    }
    public void onSensorChanged(SensorEvent event) {
      //pass the values to view for display
      _view.setOrientation(event.values[0],event.values[1],event.values[2]);
    }
  };
  protected void onCreate(Bundle savedInstanceState) {
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(sensorListener,
            sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
            SensorManager.SENSOR_DELAY_FASTEST);
    _view = new MyView(this);
  }
}

上面的代码将在屏幕顶部显示包含更新值的文本。您会注意到这些值经常更新。同样,如果您正在使用布局,只需使用新的事件值更新文本视图。

祝你好运!