2015-05-20 9 views
0

Я хочу изменить ориентацию OSMdroid MapView в направлении, в котором движется пользователь (рассчитано с Location.bearingTo между предыдущим и текущим местоположением пользователя на каждом onLocationChanged и конвертируется в нормальные градусы вместо -180/180 ° к востоку от Истинного Севера).Изменить ориентацию MapView

Это направление верное, я поворачиваю изображение стрелки в этом направлении, и оно обязательно направляется в нужное направление.
Однако, когда я хочу ориентировать MapView на это userDirection, используя метод setMapOrientation (задокументированный here), это не работает так, как я хочу. Когда я ориентирую карту в направлении пользователя, изображение стрелки должно всегда указывать на север, правильно? Потому что это желание, которого я хочу достичь: чтобы казалось, что стрелка всегда указывает вперед (например, трекер GPS: ваше местоположение на GPS всегда представлено значком, идущим вперед, моя стрелка указывает на все виды направлений, потому что ориентация карты неверна).

Я предполагаю, что osmdroid.MapView orientation ожидает другого рода значения степени, но я попытался перейти на восток от истинных северных градусов, не работал. Или моя логика совершенно неверна, и это - работает правильно.

Как установить ориентацию для MapView так, чтобы она всегда была направлена ​​в текущее направление пользователя, чтобы стрелка всегда указывала вперед (и не двигалась назад, вправо или влево, ...)?

ответ

2

Я думаю, что вы имеете в виду ориентацию карты «True North» с использованием компаса True North. Для этого вам нужно устройство Compass или Sensor Listener, чтобы получить направление, после получения заголовка вам нужно установить его для MapView. Вот фрагмент, который очень полезен.

private void compassHeadingUp() { 

     if(enableCompassHeadUp){ 
      mSensorManager.registerListener(mySensorEventListener, 
        SensorManager.SENSOR_ORIENTATION, 
        SensorManager.SENSOR_DELAY_FASTEST); 
     } else { 
      mSensorManager.unregisterListener(mySensorEventListener); 
      mDirection = 0; 
     } 
} 

public SensorListener mySensorEventListener = new SensorListener(){ 

    @Override 
    public void onAccuracyChanged(int arg0, int arg1) { 

    } 

    @Override 
    public void onSensorChanged(int sensor, float[] values) { 
     synchronized (this) { 
      float mHeading = values[0];    
      if(Math.abs(mDirection-mHeading) > Constance.ROTATION_SENSITIVITY){ 
       mMapView.setMapOrientation(-mHeading); 
       mDirection = mHeading; 
      } 
      Matrix matrix = new Matrix(); 
      mCompassImageView.setScaleType(ScaleType.MATRIX); 
      matrix.postRotate((float) -mHeading, mCompassImageView.getDrawable().getBounds().width()/2, mCompassImageView.getDrawable().getBounds().height()/2); 
//Set your Arrow image view to the matrix 
mCompassImageView.setImageMatrix(matrix); 
      } 
     } 
    }; 
+0

Спасибо за ответ, я реализую его прямо сейчас, но у меня есть один вопрос: какая польза от переменной 'enableCompassHeadUp'? Что он проверяет? – Fluppe

+0

Его просто логическое значение для включения или выключения датчика, так что у вас может быть опция On/Off – zIronManBox

+0

Переменная 'Constance.ROTATION_SENSITIVITY', откуда она извлекается? – Fluppe