如果您能提供您正在使用的传感器类型,将会更有用。我假设它是Sensor.TYPE_ORIENTATION
.
1)如果我的函数执行很长时间,并且发生了 2 个 onSensorChanged 事件,那么这两个事件都会被调用还是只调用最新的一个?
onSensorChanged 方法提供了一个事件对象(values
参数),其中附加了特定传感器的值。为了Sensor.TYPE_ORIENTATION
, event.values[0]
是方位角,event.values[1]
是音高,并且event.values[2]
是卷。阅读 Android 开发者 SensorEvent 页面 http://developer.android.com/reference/android/hardware/SensorEvent.html为了更好地理解这一点。上述值的更新速度相当快,只有处理这些值更改的方式才能决定将使用哪个值更新。例如,您可以根据事件值的更改方式不断更新视图。
2) onSensorChanged 函数是否在 Activity 线程以外的不同线程上运行?
它在不同的线程上运行,该线程依赖于它所附加到的活动(实现了SensorEventListener
接口或包含从在其上创建的匿名内部类实例化的对象SensorEventListener
目的)。
3)onSensorcChanged函数的多个实例是否在不同线程上运行?变量访问是否有任何类型的同步?
我对此不太确定,但我想他们会同步event
正在更新的对象。是的,实现类的多个实例SensorEventListener
接口可以单独运行。
4)谁能告诉我在哪里可以找到有关 onSensorChanged() 或相关信息的任何详细信息?
- SensorEventListener 文档 http://developer.android.com/reference/android/hardware/SensorEventListener.html#onSensorChanged%28android.hardware.SensorEvent%29
5)有什么方法可以让我先玩游戏一段时间,看看值如何变化以及函数的执行方式如何不同?
您使用图形或布局吗?如果您使用图形,
活动类别:
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);
}
}
上面的代码将在屏幕顶部显示包含更新值的文本。您会注意到这些值更新非常频繁。同样,如果您使用布局,只需使用新事件值更新文本视图即可。
祝你好运!