2015-10-20 55 views
0

現在我正在嘗試旋轉電話。我已經設法編寫了代碼,這是這樣做的,但不幸的是它只給按鈕點擊賦值。每次值更改時如何更新TextView?換句話說 - 這裏有沒有EventListener?如果是的話,如何實施呢?獲取電話角度

public class MainActivity extends Activity { 

SensorManager _sensorManager; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);   

    SensorManager sensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);   

    final float[] mValuesMagnet  = new float[3]; 
    final float[] mValuesAccel  = new float[3]; 
    final float[] mValuesOrientation = new float[3]; 
    final float[] mRotationMatrix = new float[9]; 

    final Button btn_valider = (Button) findViewById(R.id.btn1); 
    final TextView txt1 = (TextView) findViewById(R.id.textView1); 
    final SensorEventListener mEventListener = new SensorEventListener() { 
     public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     } 

     public void onSensorChanged(SensorEvent event) { 
      // Handle the events for which we registered 
      switch (event.sensor.getType()) { 
       case Sensor.TYPE_ACCELEROMETER: 
        System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
        break; 

       case Sensor.TYPE_MAGNETIC_FIELD: 
        System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
        break; 
      } 
     }; 
    }; 

    // You have set the event lisetner up, now just need to register this with the 
    // sensor manager along with the sensor wanted. 
    setListners(sensorManager, mEventListener); 

    btn_valider.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View view) 
     { 
      SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet); 
      SensorManager.getOrientation(mRotationMatrix, mValuesOrientation); 
      final CharSequence test; 
      float XAxis = (float) (mValuesOrientation[0] * 180/Math.PI); 
      float YAxis = (float) (mValuesOrientation[1] * 180/Math.PI); 
      float ZAxis = (float) (mValuesOrientation[2] * 180/Math.PI); 
      test = "results: " + XAxis +" "+ YAxis+ " "+ ZAxis; 
      txt1.setText(test); 
     } 
    }); 

} 

// Register the event listener and sensor type. 
public void setListners(SensorManager sensorManager, SensorEventListener mEventListener) 
{ 
    sensorManager.registerListener(mEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(mEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
       SensorManager.SENSOR_DELAY_NORMAL); 

    } 
} 

回答

1

移動方位計算部分在一個單獨的方法:

private void calculateOrientation(){ 
     SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet); 
     SensorManager.getOrientation(mRotationMatrix, mValuesOrientation); 
     final CharSequence test; 
     float XAxis = (float) (mValuesOrientation[0] * 180/Math.PI); 
     float YAxis = (float) (mValuesOrientation[1] * 180/Math.PI); 
     float ZAxis = (float) (mValuesOrientation[2] * 180/Math.PI); 
     test = "results: " + XAxis +" "+ YAxis+ " "+ ZAxis; 
     txt1.setText(test); 
} 

注意您已經通過調用更新的TextView的值「txt1.setText(測試);」計算方向後。因此,現在您必須確保每次傳感器數據發生變化時調用此方向計算方法。

那麼,剛剛從onSensorChanges(內部調用此方法)方法:

public void onSensorChanged(SensorEvent event) { 
     // Handle the events for which we registered 
     switch (event.sensor.getType()) { 
     case Sensor.TYPE_ACCELEROMETER: 
      System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
      break; 

     case Sensor.TYPE_MAGNETIC_FIELD: 
      System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
      break; 
     } 

     //Call the orientation calculation method 
     calculateOrientation(); 
}; 

這在每一次有新的傳感器數據可用時間更新您的TextView。

+0

是的,它做到了。非常感謝Coder先生。 –