2015-10-20 59 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先生。 –