Я создал приложение для компаса, и оно, кажется, работает правильно, когда вы запускаете его на реальном устройстве, потому что компас перемещается из одной точки в другую. Но если вы запустите приложение компаса телефона по умолчанию, вы увидите, что стрелка указывает в сторону. На самом деле, вы заметите, что приложение, созданное студией android, работает странно и игла движется неправильно. Я думаю, что проблема не имеет ничего общего с анимацией изображения, а с кодом доступа к датчикам.
Я оставляю вам основной код внизу:
public class MainActivity extends AppCompatActivity implements SensorEventListener {
Float azimuth_angle;
private SensorManager compassSensorManager;
Sensor accelerometer;
Sensor magnetometer;
TextView tv_degrees;
ImageView iv_compass;
private float current_degree = 0f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
compassSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
accelerometer = compassSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magnetometer = compassSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
protected void onResume(){
super.onResume();
compassSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
compassSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);
}
protected void onPause(){
super.onPause();
compassSensorManager.unregisterListener(this);
}
float[] accel_read;
float[] magnetic_read;
@Override
public void onSensorChanged(SensorEvent event) {
tv_degrees = (TextView)findViewById(R.id.tv_degrees);
iv_compass = (ImageView)findViewById(R.id.iv_compass);
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
accel_read = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
magnetic_read = event.values;
if (accel_read != null && magnetic_read != null){
float R[] = new float[9];
float I[] = new float[9];
boolean successful_read = SensorManager.getRotationMatrix(R, I, accel_read, magnetic_read);
if (successful_read) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
azimuth_angle = orientation[0];
float degrees = ((azimuth_angle *180f) / 3.14f);
int degreesInt = Math.round(degrees);
tv_degrees.setText(Integer.toString(degreesInt) + (char) 0x00B0 + " to absolute north.");
RotateAnimation rotate = new RotateAnimation(current_degree, -degreesInt, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(100);
rotate.setFillAfter(true);
iv_compass.startAnimation(rotate);
current_degree = -degreesInt;
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
Пожалуйста, если вы знаете, что не так , скажите мне. И если вам нужна дополнительная информация, не стесняйтесь спрашивать ее.
Спасибо.