Chế độ xem phố của Google cung cấp chế độ xem 360 độ toàn cảnh từ các con đường được chỉ định trong suốt khu vực phủ sóng.
Video này cho thấy cách bạn có thể sử dụng dịch vụ Chế độ xem phố để cung cấp cho người dùng trải nghiệm thực tế về một địa chỉ trên bản đồ, cung cấp cho họ ngữ cảnh có ý nghĩa về điểm đến hoặc bất kỳ địa điểm nào mà họ quan tâm.
Mức độ phù hợp có sẵn thông qua API Android phiên bản 2 của Google Maps cũng tương tự như phạm vi áp dụng của ứng dụng Google Maps trên thiết bị Android. Bạn có thể đọc thêm về Chế độ xem phố và xem các khu vực được hỗ trợ trên bản đồ tương tác, tại Giới thiệu về Chế độ xem phố.
Lớp StreetViewPanorama
sẽ lập mô hình ảnh toàn cảnh của Chế độ xem phố trong ứng dụng của bạn. Trong giao diện người dùng, ảnh toàn cảnh được biểu thị bằng một đối tượng StreetViewPanoramaFragment
hoặc StreetViewPanoramaView
.
Mã mẫu
Kho lưu trữ ApiDemos trên GitHub bao gồm các mẫu minh hoạ cách sử dụng Chế độ xem phố.
Mẫu Java:
- streetviewPanoramaBasicDemoActivity: Khái niệm cơ bản về việc sử dụng Chế độ xem phố
- streetviewPanoramaEventsDemoActivity: Lắng nghe các sự kiện
- streetviewPanoramaNavigationDemoActivity: Kiểm soát ảnh toàn cảnh trong Chế độ xem phố theo phương thức lập trình
- streetviewPanoramaOptionsDemoActivity: Thay đổi tùy chọn giao diện người dùng và cử chỉ
- Chế độ xem toàn cảnh Chế độ xem toàn cảnh: Sử dụng
StreetViewPanoramaView
(thay vì một Mảnh) - SplitCảnhPanoramaAndMapDemoActivity: Tạo một hoạt động hiển thị chế độ xem phố và một bản đồ
Mẫu Kotlin:
- streetviewPanoramaBasicDemoActivity: Khái niệm cơ bản về việc sử dụng Chế độ xem phố
- streetviewPanoramaEventsDemoActivity: Lắng nghe các sự kiện
- streetviewPanoramaNavigationDemoActivity: Kiểm soát ảnh toàn cảnh trong Chế độ xem phố theo phương thức lập trình
- streetviewPanoramaOptionsDemoActivity: Thay đổi tùy chọn giao diện người dùng và cử chỉ
- Chế độ xem toàn cảnh Chế độ xem toàn cảnh: Sử dụng
StreetViewPanoramaView
(thay vì một Mảnh) - SplitCảnhPanoramaAndMapDemoActivity: Sử dụng một hoạt động hiển thị chế độ xem phố và bản đồ
Tổng quan về Chế độ xem phố trong SDK Maps dành cho Android
SDK Maps dành cho Android cung cấp dịch vụ Chế độ xem phố để thu thập và thao tác với hình ảnh được sử dụng trong Chế độ xem phố của Google. Hình ảnh được trả về dưới dạng ảnh toàn cảnh.
Mỗi ảnh toàn cảnh của Chế độ xem phố là một hình ảnh hoặc một tập hợp các hình ảnh cung cấp chế độ xem toàn cảnh 360 độ từ một vị trí. Hình ảnh tuân theo phép chiếu hình cầu toàn cảnh (Plate Carrée), chứa chế độ xem ngang 360 độ (xoay toàn bộ) và xem dọc 180 độ (từ thẳng lên đến thẳng). Ảnh toàn cảnh 360 độ thu được xác định một phép chiếu trên hình cầu có hình ảnh được bọc vào bề mặt hai chiều của hình cầu đó.
StreetViewPanorama
cung cấp cho người xem kết xuất toàn cảnh dưới dạng ảnh toàn cảnh 360 độ với máy ảnh ở giữa. Bạn có thể thao tác StreetViewPanoramaCamera
để điều khiển mức thu phóng và hướng (nghiêng và góc) của máy ảnh.
Bắt đầu
Thực hiện theo hướng dẫn bắt đầu sử dụng để thiết lập dự án SDK Maps dành cho Android. Sau đó, thêm ảnh toàn cảnh ở Chế độ xem phố, như được mô tả bên dưới.
Thư viện ứng dụng SDK của Dịch vụ Google Play bao gồm một số mẫu Chế độ xem phố mà bạn có thể nhập vào dự án của mình và sử dụng làm cơ sở để phát triển. Xem phần giới thiệu để biết các nguyên tắc nhập mẫu.
Sử dụng API
Làm theo hướng dẫn bên dưới để thêm ảnh toàn cảnh ở Chế độ xem phố vào một mảnh Android. Đó là cách đơn giản nhất để thêm Chế độ xem phố vào ứng dụng của bạn. Sau đó, hãy đọc thêm về các mảnh, thành phần hiển thị và tuỳ chỉnh ảnh toàn cảnh.
Thêm ảnh toàn cảnh trong Chế độ xem phố
Thực hiện các bước dưới đây để thêm ảnh toàn cảnh của Chế độ xem phố như thế này:

Tóm tắt:
- Thêm một đối tượng Fragment vào Activity. Hoạt động này sẽ xử lý ảnh toàn cảnh của Chế độ xem phố. Cách dễ nhất để làm việc này là
thêm phần tử
<fragment>
vào tệp bố cục choActivity
. - Triển khai giao diện
OnStreetViewPanoramaReadyCallback
và sử dụng phương thức gọi lạionStreetViewPanoramaReady(StreetViewPanorama)
để xử lý đối tượngStreetViewPanorama
. - Gọi
getStreetViewPanoramaAsync()
trên mảnh để đăng ký lệnh gọi lại.
Dưới đây là thông tin chi tiết hơn về từng bước.
Thêm một mảnh
Thêm phần tử <fragment>
vào tệp bố cục của hoạt động để xác định đối tượng Fragment. Trong phần tử này, hãy đặt thuộc tính class
thành com.google.android.gms.maps.StreetViewPanoramaFragment
(hoặc SupportStreetViewPanoramaFragment
).
Dưới đây là ví dụ về một mảnh trong tệp bố cục:
<fragment android:name="com.google.android.gms.maps.StreetViewPanoramaFragment" android:id="@+id/streetviewpanorama" android:layout_width="match_parent" android:layout_height="match_parent"/>
Thêm mã Chế độ xem phố
Để xử lý ảnh toàn cảnh của Chế độ xem phố trong ứng dụng, bạn cần triển khai giao diện OnStreetViewPanoramaReadyCallback
và đặt một bản sao của lệnh gọi lại trên đối tượng StreetViewPanoramaFragment
hoặc StreetViewPanoramaView
. Hướng dẫn này sử dụng
StreetViewPanoramaFragment
vì đó là cách đơn giản nhất để thêm Chế độ xem phố
vào ứng dụng của bạn. Bước đầu tiên là triển khai giao diện gọi lại:
Java
class StreetViewActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback { // ... }
Kotlin
class StreetViewActivity : AppCompatActivity(), OnStreetViewPanoramaReadyCallback { // ... }
Trong phương thức onCreate()
của Activity
, hãy đặt tệp bố cục làm thành phần hiển thị nội dung. Ví dụ: nếu tệp bố cục có tên main.xml
, hãy sử dụng mã sau:
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_street_view); SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager() .findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this); }
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_street_view) val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this) }
Xử lý mảnh bằng cách gọi FragmentManager.findFragmentById()
, chuyển mã nhận dạng tài nguyên của phần tử <fragment>
.
Lưu ý mã nhận dạng tài nguyên R.id.streetviewpanorama
sẽ tự động được thêm vào dự án Android khi bạn tạo tệp bố cục.
Sau đó, hãy sử dụng getStreetViewPanoramaAsync()
để đặt lệnh gọi lại trên mảnh.
Java
SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager() .findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
Kotlin
val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this)
Sử dụng phương thức gọi lại onStreetViewPanoramaReady(StreetViewPanorama)
để truy xuất một thực thể khác rỗng của StreetViewPanorama
và sẵn sàng để sử dụng.
Java
@Override public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) { LatLng sanFrancisco = new LatLng(37.754130, -122.447129); streetViewPanorama.setPosition(sanFrancisco); }
Kotlin
override fun onStreetViewPanoramaReady(streetViewPanorama: StreetViewPanorama) { val sanFrancisco = LatLng(37.754130, -122.447129) streetViewPanorama.setPosition(sanFrancisco) }
Thông tin thêm về định cấu hình trạng thái ban đầu
Không giống như bản đồ, bạn không thể định cấu hình trạng thái ban đầu của ảnh toàn cảnh của Chế độ xem phố qua XML. Tuy nhiên, bạn có thể định cấu hình ảnh toàn cảnh theo phương thức lập trình bằng cách truyền đối tượng StreetViewPanoramaOptions
chứa các tuỳ chọn đã chỉ định.
- Nếu bạn đang sử dụng
StreetViewPanoramaFragment
, hãy sử dụng phương thức ban đầu tĩnhStreetViewPanoramaFragment.newInstance(StreetViewPanoramaOptions options)
để tạo mảnh và chuyển các tuỳ chọn đã định cấu hình tuỳ chỉnh. - Nếu bạn đang sử dụng
StreetViewPanoramaView
, hãy sử dụng hàm khởi tạoStreetViewPanoramaView(Context, StreetViewPanoramaOptions)
và truyền vào các tuỳ chọn được định cấu hình tuỳ chỉnh.
Java
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); StreetViewPanoramaView view = new StreetViewPanoramaView(this, new StreetViewPanoramaOptions().position(sanFrancisco));
Kotlin
val sanFrancisco = LatLng(37.754130, -122.447129) val view = StreetViewPanoramaView( this, StreetViewPanoramaOptions().position(sanFrancisco) )
Phim và chương trình truyền hình khác về PanoramaPanoramaFragment
StreetViewPanoramaFragment
là một lớp con của lớp Android Fragment và cho phép bạn đặt ảnh toàn cảnh của Chế độ xem phố trong một mảnh Android. Các đối tượng StreetViewPanoramaFragment
đóng vai trò là vùng chứa cho ảnh toàn cảnh và cung cấp quyền truy cập vào đối tượng StreetViewPanorama
.
Chế độ xem toàn cảnh ở Chế độ xem phố
StreetViewPanoramaView
, một lớp con của lớp
View
Android, cho phép bạn đặt ảnh toàn cảnh
ở Chế độ xem phố trong View
của Android. View
đại diện cho một vùng hình chữ nhật của màn hình và là một thành phần cơ bản cho các ứng dụng và tiện ích Android.
Giống như StreetViewPanoramaFragment
, StreetViewPanoramaView
hoạt động như một vùng chứa dành cho ảnh toàn cảnh, hiển thị chức năng cốt lõi thông qua đối tượng StreetViewPanorama
. Người dùng lớp này phải chuyển tiếp tất cả phương thức vòng đời hoạt động (chẳng hạn như onCreate()
, onDestroy()
, onResume()
và onPause())
) đến các phương thức tương ứng trong lớp StreetViewPanoramaView
.
Tùy chỉnh chức năng do người dùng kiểm soát
Theo mặc định, người dùng có thể sử dụng chức năng sau đây khi xem ảnh toàn cảnh của Chế độ xem phố: kéo, thu phóng và di chuyển đến các ảnh toàn cảnh liền kề. Bạn có thể bật và tắt các cử chỉ do người dùng kiểm soát thông qua các phương thức trên StreetViewPanorama
. Bạn vẫn có thể thực hiện các thay đổi có lập trình khi cử chỉ đang tắt.
Đặt vị trí của ảnh toàn cảnh
Để đặt vị trí ảnh toàn cảnh của Chế độ xem phố, hãy gọi
StreetViewPanorama.setPosition()
, chuyển LatLng
.
Bạn cũng có thể truyền radius
và source
dưới dạng tham số không bắt buộc.
Bán kính rất hữu ích nếu bạn muốn mở rộng hoặc
thu hẹp khu vực Chế độ xem phố sẽ tìm kiếm ảnh toàn cảnh phù hợp. Bán kính bằng 0 có nghĩa là ảnh toàn cảnh phải được liên kết với chính xác LatLng
đã chỉ định.
Bán kính mặc định là 50 mét. Nếu có nhiều ảnh toàn cảnh trong khu vực phù hợp, API sẽ trả về kết quả phù hợp nhất.
Một nguồn rất hữu ích nếu bạn muốn hạn chế Chế độ xem phố chỉ tìm các ảnh toàn cảnh ngoài trời. Theo mặc định, ảnh toàn cảnh trong Chế độ xem phố có thể ở bên trong các địa điểm như bảo tàng, tòa nhà công cộng, quán cà phê và doanh nghiệp. Lưu ý rằng ảnh toàn cảnh ngoài trời có thể không tồn tại cho vị trí được chỉ định.
Java
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco); // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20); // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR); // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR);
Kotlin
val sanFrancisco = LatLng(37.754130, -122.447129) // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco) // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20) // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR) // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR)
Ngoài ra, bạn có thể đặt vị trí dựa trên mã nhận dạng ảnh toàn cảnh bằng cách truyền panoId
đến StreetViewPanorama.setPosition()
.
Để truy xuất mã ảnh toàn cảnh cho ảnh toàn cảnh liền kề, trước tiên, hãy sử dụng getLocation()
để truy xuất StreetViewPanoramaLocation
.
Đối tượng này chứa mã của toàn cảnh hiện tại và một mảng các đối tượng StreetViewPanoramaLink
, mỗi đối tượng chứa mã của một ảnh toàn cảnh được kết nối với đối tượng hiện tại.
Java
StreetViewPanoramaLocation location = streetViewPanorama.getLocation(); if (location != null && location.links != null) { streetViewPanorama.setPosition(location.links[0].panoId); }
Kotlin
streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink -> streetViewPanorama.setPosition(link.panoId) }
Phóng to và thu nhỏ
Bạn có thể thay đổi mức thu phóng theo phương thức lập trình bằng cách đặt StreetViewPanoramaCamera.zoom
.
Đặt mức thu phóng thành 1,0 sẽ phóng to hình ảnh theo hệ số 2.
Đoạn mã sau đây sử dụng StreetViewPanoramaCamera.Builder()
để tạo máy ảnh mới với độ nghiêng và góc của máy ảnh hiện tại, đồng thời tăng mức thu phóng thêm 50 phần trăm.
Java
float zoomBy = 0.5f; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom + zoomBy) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing) .build();
Kotlin
val zoomBy = 0.5f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing) .build()
Đặt hướng máy ảnh (góc nhìn)
Bạn có thể xác định hướng của máy ảnh Chế độ xem phố bằng cách đặt độ nghiêng và độ nghiêng trên StreetViewPanoramaCamera
.
- đang mang
- Hướng mà máy ảnh trỏ, được chỉ định bằng độ theo chiều kim đồng hồ tính từ hướng bắc thực sự, xung quanh vị trí máy ảnh. Đúng về phía bắc là 0, phía đông là 90, phía nam là 180, phía tây là 270.
- nghiêng
- Trục Y nghiêng lên hoặc vuốt xuống. Phạm vi là -90 đến 0 đến 90, với -90 nhìn thẳng xuống, 0 ở giữa đường chân trời và 90 nhìn thẳng lên trên. Phương sai được đo từ cao độ mặc định ban đầu của máy ảnh, thường là (nhưng không phải lúc nào) cũng nằm ngang. Ví dụ: một hình ảnh chụp trên đồi có thể có cao độ mặc định không nằm ngang.
Đoạn mã sau đây sử dụng StreetViewPanoramaCamera.Builder()
để tạo máy ảnh mới với chế độ thu phóng và nghiêng của máy ảnh hiện tại, đồng thời thay đổi hướng xoay 30 độ sang trái.
Java
float panBy = 30; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - panBy) .build();
Kotlin
val panBy = 30f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - panBy) .build()
Đoạn mã sau giúp máy ảnh nghiêng lên 30 độ.
Java
float tilt = streetViewPanorama.getPanoramaCamera().tilt + 30; tilt = (tilt > 90) ? 90 : tilt; StreetViewPanoramaCamera previous = streetViewPanorama.getPanoramaCamera(); StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build();
Kotlin
var tilt = streetViewPanorama.panoramaCamera.tilt + 30 tilt = if (tilt > 90) 90f else tilt val previous = streetViewPanorama.panoramaCamera val camera = StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build()
Tạo ảnh động cho chuyển động của camera
Để tạo ảnh động cho các chuyển động của máy ảnh, hãy gọi StreetViewPanorama.animateTo()
.
Ảnh động nội suy giữa các thuộc tính máy ảnh hiện tại và các thuộc tính mới của máy ảnh. Nếu muốn chuyển trực tiếp đến máy ảnh mà không cần ảnh động, bạn có thể đặt thời lượng là 0.
Java
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. long duration = 1000; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - 60) .build(); streetViewPanorama.animateTo(camera, duration);
Kotlin
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. val duration: Long = 1000 val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - 60) .build() streetViewPanorama.animateTo(camera, duration)
Hình ảnh sau đây cho thấy kết quả khi bạn lên lịch chạy ảnh động ở mỗi 2000 mili giây, bằng cách sử dụng Handler.postDelayed()
:
