2013-01-14 38 views
19

Nếu bạn mở ứng dụng bản đồ của Google, có một nút ở trên cùng bên phải của màn hình mà bạn có thể nhấn để căn giữa bản đồ vào vị trí hiện tại của bạn. Sau đó, biểu tượng của nút sẽ thay đổi. Nếu bạn nhấn lại nút tương tự, bản đồ sẽ tự động xoay dựa trên tiêu đề la bàn của bạn. Nói cách khác, bản đồ trở thành egocentric (như trái ngược với AKA phân bổ phía bắc luôn lên).bản đồ android tự động xoay

Google gần đây đã khởi chạy bản đồ API V2 cho Android và tôi chắc chắn thích nó hơn so với phiên bản cũ. Theo mặc định, bản đồ android V2 sẽ bao gồm nút "center on location". Tuy nhiên, nhấn nhiều lần không bật tự động xoay vòng; nó chỉ cố gắng căn giữa bản đồ vào vị trí của bạn một lần nữa.

Có ai biết cách tự động xoay bản đồ bằng cách sử dụng bản đồ API v2 giống như ứng dụng bản đồ google không? Tôi sẽ phải thực hiện chức năng này bản thân mình hoặc là nó trong API và tôi chỉ không nhìn thấy nó? Tôi đánh giá cao tất cả sự giúp đỡ.

+0

Đó là hữu ích ... Tôi thậm chí không biết về tính năng, cảm ơn. Đối với tôi, nó hoạt động tốt (v7) –

+0

anh ta, tôi muốn làm điều tương tự, xin vui lòng chia sẻ giải pháp của bạn nếu bạn đã làm điều này. –

Trả lời

22

Ok đây là cách tôi nghĩ rằng nó nên được thực hiện một năm sau đó. Vui lòng sửa tôi nếu bạn phát hiện bất kỳ vấn đề nào.

Hầu hết các mã sau đây đề cập đến sự khác biệt giữa các hệ tọa độ. Tôi đang sử dụng một cảm biến vector xoay. Từ các tài liệu: Y is tangential to the ground at the device's current location and points towards magnetic north. Mang trong bản đồ google, mặt khác, dường như chỉ đến phía bắc thực sự. this page shows how the conversion is done

1) có được từ chối hiện từ vị trí GPS hiện tại của bạn

@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) tính toán mang từ chối và phía bắc từ

@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) cập nhật bản đồ

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

'phao tin [] mRotationMatrix = new float [16]; ' ' getRotationMatrixFromVector' sẽ cư 'mRotationMatrix' dựa trên các giá trị trong sự kiện này. –

+0

Điều này tạo ra hiệu ứng nhấp nháy trên bản đồ, làm thế nào tôi có thể giới hạn vòng quay – Bytecode

0

Xin lỗi, bạn sẽ phải thực hiện nó cho mình với sensor managercamera

nếu những chức năng đã sẵn sàng cho V2 đồ api họ chắc chắn sẽ là một trong hai trên GoogleMap hoặc UiSettings

1

Có thể bằng cách đăng ký ứng dụng của bạn với Trình nghe cảm biến cho Định hướng và nhận góc tương ứng với phía bắc thực sự bên trong onSensorChanged và cập nhật camera tương ứng. Góc có thể được sử dụng để mang. Các mã sau đây có thể được sử dụng:

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

tôi đã thực hiện thành công aleph_null giải pháp và ở đây tôi sẽ bổ sung thêm một số chi tiết không được đề cập trong các giải pháp được chấp nhận:

Đối với giải pháp trên để làm việc bạn cần phải thực hiện giao diện android.hardware.SensorEventListener.

Bạn cũng cần phải đăng ký với SensorEventListener trong bạn phương pháp onResume và onPause như sau:

@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); 
} 

Lưu ý để "@Bytecode": Để ​​tránh nhấp nháy, sử dụng giá trị thấp trong giai đoạn lấy mẫu, một cái gì đó giống như SensorManager .SENSOR_STATUS_ACCURACY_LOW.

Tôi cũng nhận thấy rằng cảm biến gửi dữ liệu nhiều hơn một chút so với thiết bị có thể xử lý và do đó, máy ảnh bản đồ bắt đầu di chuyển theo cách lạ!

Để kiểm soát số lượng dữ liệu xử lý bởi onSensorChanged, tôi đề nghị việc thực hiện sau đây:

@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

trong đó góc được xác định – suulisin

Các vấn đề liên quan