2013-01-14 29 views
19

Google maps uygulamasını açarsanız, ekranın sağ üst köşesinde haritayı geçerli konumunuza ortalamak için basabileceğiniz bir düğme vardır. Düğmenin simgesi değişir. Aynı düğmeye tekrar basarsanız, harita pusula yönünüzü temel alarak otomatik olarak döner. Başka bir deyişle, harita egosentrik hale gelir (tahsisli AKA'nın kuzeyi her zaman olduğu gibi).android haritalar otomatik döndürme

Google yakın zamanda Android için API V2 haritaları başlattı ve kesinlikle eski olandan daha çok beğeniyorum. Varsayılan olarak, V2 android haritaları "konumdaki merkez" düğmesini içerecektir. Ancak, bir kereden fazla basmak otomatik döndürmeyi etkinleştirmez; haritayı tekrar konumunuza yeniden konumlandırmaya çalışır.

Google Haritalar uygulamasının yaptığı gibi haritalar API v2'yi kullanarak haritayı otomatik olarak nasıl çevirebileceğimi bilen var mı? Bu işlevselliği kendim uygulamak zorunda mıyım yoksa API'da mı olmalıyım ve görmüyorum? Tüm yardımları takdir ediyorum.

+0

... Hatta, bu özellik hakkında sayesinde bilmiyordum:

onSensorChanged tarafından ele veri miktarını kontrol etmek için, aşağıdaki uygulanmasını öneriyoruz. Benim için iyi çalışıyor (v7) –

+0

o, ben de aynı şeyi yapmak istiyorum, eğer bunu yaptıysanız lütfen çözümünüzü paylaşın. –

cevap

22

Ok üzerinde ya olacağını sensor manager ve camera

ile kendiniz uygulamak gerekecek İşte bir yıl sonra yapılması gerektiğini düşünüyorum. Herhangi bir sorunu tespit ederseniz lütfen beni düzeltin.

Aşağıdaki kodların çoğu, koordinat sistemleri arasında bir tutarsızlık ile ilgilidir. Bir rotasyon vektör sensörü kullanıyorum. Dokümanlardan: Y is tangential to the ground at the device's current location and points towards magnetic north. Google haritalarındaki yatak, gerçek kuzeyi gösteriyor gibi görünüyor. this page shows how the conversion is done

1) meyl ve manyetik kuzey taşıyan hesaplamak) GPS konumu

@Override 
public void onLocationChanged(Location location) { 
    GeomagneticField field = new GeomagneticField(
      (float)location.getLatitude(), 
      (float)location.getLongitude(), 
      (float)location.getAltitude(), 
      System.currentTimeMillis() 
     ); 

    // getDeclination returns degrees 
    mDeclination = field.getDeclination(); 
} 

2 güncel Sapma olsun

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
     SensorManager.getRotationMatrixFromVector(
       mRotationMatrix , event.values); 
     float[] orientation = new float[3]; 
     SensorManager.getOrientation(mRotationMatrix, orientation); 
     float bearing = Math.toDegrees(orientation[0]) + mDeclination; 
     updateCamera(bearing); 
    } 
} 

3) güncelleme

private void updateCamera(float bearing) { 
    CameraPosition oldPos = mMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing).build(); 
      mMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 
} 
+1

mRotationMatrix? – Anthone

+1

'Özel Float [] mRotationMatrix = Yeni Float [16];' 'getRotationMatrixFromVector', olaydaki değerlere bağlı olarak mRotationMatrix'ı dolduracaktır. –

+0

Bu, harita üzerinde titrek etki yaratır, döndürmeyi nasıl sınırlandırabilirim – Bytecode

1

haritalar Uygulamanızın Sensör Dinleyici ile kaydedilmesi mümkündür. Oryantasyon ve gerçek kuzeye göre açı elde etme onSensorChanged ve kamerayı buna göre günceller. Açı, rulman için kullanılabilir. Ben başarıyla çözümü aleph_null uygulayan

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION 
has been deprecated. 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if (sensorManager != null) 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_GAME); 
} 

public void onSensorChanged(SensorEvent event) { 

    float degree = Math.round(event.values[0]); 

    Log.d(TAG, "Degree ---------- " + degree); 

    updateCamera(degree); 

} 

private void updateCamera(float bearing) { 
    CameraPosition oldPos = googleMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) 
      .build(); 

    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 

} 
5

ve burada kabul ettim çözümde belirtilmeyen bazı ayrıntıları katacak: Aşağıdaki kod kullanılabilir uygulamak gerekir çalışmak yukarıdaki çözüm için

android.hardware.SensorEventListener arayüzü.

Sen aşağıdaki gibi senin onResume ve OnPause yöntemlerde SensorEventListener için kayıt da gerekir:, titremeyi önlemek için, örnekleme dönemi için SensorManager gibi bir şey düşük değeri kullanın:

@Override 
    protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, 
      mRotVectSensor, 
      SensorManager.SENSOR_STATUS_ACCURACY_LOW); 
    } 

@Override 
protected void onPause() { 
    // unregister listener 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
} 

Not "@Bytecode" .SENSOR_STATUS_ACCURACY_LOW.

Ayrıca algılayıcının aygıtın kullanabileceğinden daha fazla veri gönderdiğini ve sonuç olarak harita kamerasının garip bir şekilde hareket etmeye başladığını fark ettim!yararlı oldu

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
     SensorManager.getRotationMatrixFromVector(
       mRotationMatrix, event.values); 
     float[] orientation = new float[3]; 
     SensorManager.getOrientation(mRotationMatrix, orientation); 
     if (Math.abs(Math.toDegrees(orientation[0]) - angle) > 0.8) { 
      float bearing = (float) Math.toDegrees(orientation[0]) + mDeclination; 
      updateCamera(bearing); 
     } 
     angle = Math.toDegrees(orientation[0]); 
    } 
} 
+0

'mRotVectSensor'? – theapache64

+0

burada açı tanımlandı – suulisin

İlgili konular