不飞则已,一飞冲天;不鸣则已,一鸣惊人。这篇文章主要讲述Android Compass指向我的位置而不是北相关的知识,希望能为你提供帮助。
我正在开发指南针应用程序,我希望指南针指向特定的纬度经度位置,而不是通常的北方。我找到了一些与我的问题有关的questions,但我没有设法让它们为我工作。这是我的代码:
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private ImageView image;
private float currentDegree = 0f;
private SensorManager mSensorManager;
private TextView tvHeading;
private Location location = new Location("A");
private Location target = new Location("B");
private LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.imageViewCompass);
tvHeading = (TextView) findViewById(R.id.tvHeading);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
location.setLatitude(54.903535);
location.setLongitude(23.979342);
target.setLatitude(54.904618);
target.setLongitude(23.978782);
}@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
// to stop the listener and save battery
}@Override
public void onSensorChanged(SensorEvent event) {
float degree = Math.round(event.values[0]);
tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");
RotateAnimation ra = new RotateAnimation(
currentDegree,
-degree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF,
0.5f);
ra.setDuration(210);
ra.setFillAfter(true);
image.startAnimation(ra);
currentDegree = -degree;
}@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// not in use
}
}
目前我的指针只显示在北方,而不是我的编码目标位置。
答案【Android Compass指向我的位置而不是北】我想我找到了这样做的方法:这是我改变以获得预期行为的方法(基于this问题和CookieMonster答案)
@Override
public void onSensorChanged(SensorEvent event) {
// get the angle around the z-axis rotated
float degree = Math.round(event.values[0]);
degree += geoField.getDeclination();
float bearing = location.bearingTo(target);
degree = (bearing - degree) * -1;
degree = normalizeDegree(degree);
tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");
// create a rotation animation (reverse turn degree degrees)
RotateAnimation ra = new RotateAnimation(
currentDegree,
-degree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF,
0.5f);
// how long the animation will take place
ra.setDuration(210);
// set the animation after the end of the reservation status
ra.setFillAfter(true);
// Start the animation
image.startAnimation(ra);
currentDegree = -degree;
}private float normalizeDegree(float value) {
if (value >
= 0.0f &
&
value <
= 180.0f) {
return value;
} else {
return 180 + (180 + value);
}
}
推荐阅读
- 某些设备按下按钮时获取应用程序中的位置时Android无响应
- Android在服务中使用Geocoder获取位置地址
- Android(使用FusedLocationProviderClient获取一次位置())
- 尝试在空对象引用上调用虚方法'double android.location.Location.getLatitude()'[duplicate]
- 如何使用Swift在Cocoa App中设置NSView的颜色()
- Android位置权限代码无法正常运行
- 在Android中计算罗盘方位/前往位置
- 从类android获取位置
- 创建为您提供位置的按钮(Android Studio)