Bạn nên sử dụng CameraUpdate
lớp để làm (có thể) tất cả các chuyển động bản đồ lập trình.
Để làm điều này, trước tiên hãy tính giới hạn của tất cả các điểm đánh dấu như vậy:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Sau đó, có được một đối tượng mô tả chuyển động bằng cách sử dụng nhà máy CameraUpdateFactory
::
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Cuối cùng di chuyển bản đồ:
googleMap.moveCamera(cu);
Hoặc nếu bạn muốn một hình ảnh động:
googleMap.animateCamera(cu);
Đó là tất cả :)
Làm rõ 1
Hầu như tất cả các phương thức di chuyển đều yêu cầu Map
đối tượng phải vượt qua quá trình bố trí. Bạn có thể chờ đợi điều này xảy ra bằng cách sử dụng addOnGlobalLayoutListener
cấu trúc. Chi tiết có thể được tìm thấy trong các ý kiến cho câu trả lời này và câu trả lời còn lại. Bạn cũng có thể tìm thấy một mã hoàn chỉnh để thiết lập phạm vi bản đồ bằng cách sử dụng addOnGlobalLayoutListener
ở đây .
Làm rõ 2
Một nhận xét lưu ý rằng việc sử dụng phương pháp này chỉ cho một điểm đánh dấu trong thu phóng bản đồ được đặt thành mức thu phóng "kỳ quái" (mà tôi tin là mức thu phóng tối đa có sẵn cho vị trí đã cho). Tôi nghĩ rằng điều này được mong đợi bởi vì:
- Các
LatLngBounds bounds
ví dụ sẽ có northeast
tài sản tương đương với southwest
, có nghĩa là phần diện tích đất được bao phủ bởi đây bounds
chính là bằng không. (Điều này hợp lý vì một điểm đánh dấu duy nhất không có khu vực.)
- Bằng cách chuyển
bounds
cho CameraUpdateFactory.newLatLngBounds
bạn về cơ bản yêu cầu tính toán mức thu phóng như vậy bounds
(có diện tích bằng 0) sẽ bao phủ toàn bộ chế độ xem bản đồ.
- Bạn thực sự có thể thực hiện tính toán này trên một tờ giấy. Mức thu phóng lý thuyết là câu trả lời là + (vô cực dương). Trong thực tế,
Map
đối tượng không hỗ trợ giá trị này để nó được kẹp ở mức tối đa hợp lý hơn được phép cho vị trí đã cho.
Một cách khác để đặt nó: làm thế nào Map
đối tượng có thể biết nên chọn mức thu phóng nào cho một vị trí ? Có thể giá trị tối ưu phải là 20 (nếu nó đại diện cho một địa chỉ cụ thể). Hoặc có thể 11 (nếu nó đại diện cho một thị trấn). Hoặc có thể là 6 (nếu nó đại diện cho một quốc gia). API không thông minh và quyết định là tùy thuộc vào bạn.
Vì vậy, bạn chỉ cần kiểm tra nếu markers
chỉ có một vị trí và nếu vậy, hãy sử dụng một trong:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- đi đến vị trí đánh dấu, giữ nguyên mức thu phóng hiện tại.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- đi đến vị trí đánh dấu, đặt mức thu phóng thành giá trị được chọn tùy ý 12.