這將是更爲有用,如果你能提供你正在使用哪種類型的傳感器。我會假設它是Sensor.TYPE_ORIENTATION
。
1)如果我的函數執行了很長時間,2個onSensorChanged事件發生了嗎?既可以被調用,也可以只調用最新的?
onSensorChanged方法提供了一個事件對象(values
參數),其中附加了特定傳感器的值。爲Sensor.TYPE_ORIENTATION
,event.values[0]
是方位角,event.values[1]
是Pitch,而event.values[2]
是Roll。 Read the Android Developers SensorEvent page更好地理解這一點。上述值更新得相當快,而且它只是處理這些值更改的方式,它決定了將使用哪個值更新。例如,您可以根據事件值如何更改來持續更新您的視圖。
2)onSensorChanged函數是否在不同於活動線程的線程上運行?
它運行在不同的線程,其是依賴於它已經被附加到(要麼實現的SensorEventListener
接口或包含來自SensorEventListener
對象上創建一個匿名內部類實例化的對象的活性)的活性。
3)onSensorcChanged函數的多個實例是否在不同的線程上運行?變量訪問是否存在任何類型的同步?
我對此不太確定,但我會想象他們會在更新時同步event
對象。是的,實現SensorEventListener
接口的多個類實例可以單獨運行。
4)任何人都可以指向我在哪裏可以找到有關onSensorChanged()或相關信息的任何詳細信息?
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);
}
}
上面的代碼將顯示在該頂部包含更新值文本屏幕。您會注意到這些值非常頻繁地更新。同樣,如果您正在使用佈局,只需使用新的事件值更新文本視圖。
祝你好運!