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

1)如果我的函数执行了很长时间以至于发生了2个onSensorChanged事件,那么两者都被调用还是仅被最新的一个调用?

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

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

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

5)有什么办法可以让我第一次玩游戏一段时间,看看值在tine上如何变化,以及函数如何执行不同?

最佳答案

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



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



它在不同的线程上运行,该线程取决于已附加的 Activity (该 Activity 实现了SensorEventListener接口(interface)或包含从在SensorEventListener对象上创建的匿名内部类实例化的对象)。



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


  • SensorEventListener documentation



  • 您是否正在使用图形或布局?如果您使用的是图形,

    Activity 类别:
    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);
      }
    }
    

    查看类
    class MyView extends View() {
             Context _context;
             int _azimuth, _pitch, _roll;
             public MyView(Context context) {
              super(context);
              _context = context;
             }
             public setOrientation(azimuth, pitch, roll) {
              _azimuth = azimuth;
              _pitch = pitch;
              _roll = roll;
            }
            protected void onDraw(Canvas canvas) {
             paint.setStyle(Paint.Style.FILL);
             paint.setColor(Color.BLACK);
             canvas.drawText("Azimuth: " + _azimuth + "Pitch: " + _pitch + "Roll: "
                        + _roll, 10, 10, paint);
            }
          }
    

    上面的代码将在屏幕顶部显示包含更新值的文本。您会注意到这些值非常频繁地更新。同样,如果您使用的是布局,则只需使用新的事件值更新文本 View 。

    祝你好运!

    10-04 14:58