2015-10-20 6 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

Да, это было трюк. Большое вам спасибо, г-н Кодер. –