Bạn nên sử dụng CameraUpdatelớ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 addOnGlobalLayoutListenercấ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 boundsví dụ sẽ cónortheasttài sản tương đương vớisouthwest, có nghĩa là phần diện tích đất được bao phủ bởi đâyboundschí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 boundschoCameraUpdateFactory.newLatLngBoundsbạn về cơ bản yêu cầu tính toán mức thu phóng như vậybounds(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 markerschỉ 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.