我制作了一个指南针应用程序,当您在真实设备中运行它时,它似乎可以正常工作,因为指南针从一个点移动到另一个点。但是,如果您运行手机默认的指南针应用程序,则会看到指针指向远处。实际上,您会注意到android-studio制作的应用程序运行异常,并且针未正确移动。我认为问题与图像动画无关,而与访问传感器的代码有关。
我将主要代码留在下面:
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) {
}
}
如果您知道怎么了,请告诉我。而且,如果您需要更多信息,请随时提出要求。
谢谢。