2016-04-07 21 views
10

私はコンパスのアプリケーションを開発しています。コンパスは通常の北ではなく、特定の緯度経度を指し示します。私はいくつかは私の問題に関連してquestionsが見つかりましたが、私はそれらを私のために働くように管理していません。私のコードは以下の通りです:Androidコンパスが北の代わりに私の場所を指している

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 
    } 
} 

現在のところ、私のポインタはハーココード化されたターゲット位置の代わりに北にしか表示されません。

+0

を変更している方法だ私は、これはまさにあなたが探しているではないと思います受け入れられた解決策を試してみると、助けが得られるかもしれません。http://stackoverflow.com/questions/4308262/calculate-compass-bearing-heading-to-location-in-android – Raghavendra

答えて

2

私はそれを行う方法を見つけたと思う: ここで私は(this質問とクッキーモンスターの回答に基づいて)正常な動作を得るために

@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); 
     } 
    } 
関連する問題