2016-04-07 37 views
10

Sto sviluppando l'applicazione della bussola dove voglio che la bussola indichi una particolare posizione di latitudine anziché il solito nord. Ho trovato alcuni questions relativi al mio problema ma non riesco a farli funzionare per me. Ecco il mio codice:La bussola Android punta alla mia posizione anziché a nord

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

attualmente il mio puntatore mostra solo in nord invece che nella mia posizione di destinazione harcoded.

+0

Credo che questo non è esattamente si sta cercando ma prova la soluzione accettata per ottenere aiuto http://stackoverflow.com/questions/4308262/calculate-compass-bearing-heading-to-location-in-android. – Raghavendra

risposta

2

Credo di aver trovato il modo di farlo: Ecco il metodo che ho cambiato per ottenere comportamento previsto (Basato su this domanda e risposta 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); 
     } 
    }