2011-04-21 36 views
4

我想在android平臺上編寫一個運動感應遊戲。我將我的整個運動檢測算法加入到onSensorChanged()函數中。問題是函數根據輸入執行不同的時間。我對如何在函數執行和被調用某些查詢: -關於android加速器onSensorChanged的信息

1)如果我的函數,該函數2 onSensorChanged事件發生時,做到既被調用或只有最新的一個很長的時間來執行?

2)是否onSensorChanged功能上比活動線程不同的線程上運行?

3)不要在不同的線程運行onSensorcChanged功能的多個實例?變量訪問是否存在任何類型的同步?

4)任何人都可以點我在哪裏可以找到有關onSensorChanged()或相關信息的任何詳細信息?

5)有什麼辦法,我可以先玩遊戲了一段時間,看到了價值觀如何變化的齒和功能如何執行不同?

回答

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接口或包含來自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); 
     } 
     } 

上面的代碼將顯示在該頂部包含更新值文本屏幕。您會注意到這些值非常頻繁地更新。同樣,如果您正在使用佈局,只需使用新的事件值更新文本視圖。

祝你好運!