我正在尝试在android平台上编写运动感应游戏。我将整个运动检测算法都包含在onSensorChanged()函数中。问题在于该函数根据输入执行不同的时间。我对函数的执行方式和调用方式有某些疑问:
1)如果我的函数执行了很长时间以至于发生了2个onSensorChanged事件,那么两者都被调用还是仅被最新的一个调用?
2)onSensorChanged函数是否在 Activity 线程以外的其他线程上运行?
3)onSensorcChanged函数的多个实例是否在不同的线程上运行?变量访问是否有任何类型的同步?
4)谁能指出我在哪里可以找到有关onSensorChanged()的任何详细信息或相关信息?
5)有什么办法可以让我第一次玩游戏一段时间,看看值在tine上如何变化,以及函数如何执行不同?
最佳答案
如果您可以提供所使用的传感器类型,则将更为有用。我将假设它是Sensor.TYPE_ORIENTATION
。
onSensorChanged方法提供一个事件对象(values
参数),特定传感器的值附加到该对象。对于Sensor.TYPE_ORIENTATION
,event.values[0]
是方位角,event.values[1]
是音高,event.values[2]
是Roll。 Read the Android Developers SensorEvent page可以更好地理解这一点。上面的值更新非常快,并且只有处理这些值更改的方式才能确定将使用哪个值更新。例如,您可以根据事件值的更改方式不断更新 View 。
它在不同的线程上运行,该线程取决于已附加的 Activity (该 Activity 实现了SensorEventListener
接口(interface)或包含从在SensorEventListener
对象上创建的匿名内部类实例化的对象)。
我对此不太确定,但是我可以想象他们会在更新event
对象时对其进行同步。是的,实现SensorEventListener
接口(interface)的类的多个实例可以单独运行。
您是否正在使用图形或布局?如果您使用的是图形,
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 。
祝你好运!