Android Google Map Street View示例
在本教程中,我们将在Android应用程序中实现Google Maps的StreetView功能。
要将Google Maps API集成到您的应用程序中,请遵循本教程。
Google Map StreetView
顾名思义,街景视图提供了街景。
使用StreetView,您可以看到整个街道的图像,而无需查看位置的固定位置!
Google街景视图可提供该位置的360度全景视图。
街景视图可用于Android中的Google Maps v2。
要在您的应用程序中查看街景,您需要使用StreetViewPanorama类。
StreetViewPanorama负责在观看者(您)位于球体中心的情况下显示360度全景图像。
要将街景视图集成到您的应用程序中,您需要使用在XML布局中添加片段StreetViewPanoramaFragment。
<fragment
android:id="@+id/googleMapStreetView"
android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
SupportStreetViewPanoramaFragment用于代替StreetViewPanoramaFragment以支持向后兼容。
要在您的应用程序中加载Google Maps Street View,您需要实现以下接口:OnStreetViewPanoramaReadyCallback。
方法" onStreetViewPanoramaReady"被触发。
在此方法中,我们在StreetViewPanaroma实例上设置以下属性:
setPosition–我们在这里传递LatLang。
可选地,我们可以传递一个常量StreetViewSource.OUTDOOR来查看位置(在街道上)的室外视图,而不是内部视图。setStreetNamesEnabled(boolean)-启用此项将在全景图像上显示街道名称(如果存在)。
setUserNavigationEnabled(boolean)–启用此选项后,用户可以通过单击导航链接导航到不同的全景图。
setPanningGesturesEnabled()和setZoomGesturesEnabled()允许我们更改摄像机角度并分别放大到街道。
要获取街景视图中的当前位置,我们需要执行以下操作:streetViewPanorama.getLocation().position。
getLocation()返回一个StreetViewPanoramaLocation实例。
在这种情况下,我们可以检索属性"链接"。
链接基本上是连接到当前全景图的所有全景图像的数组。
街景全景监听
我们可以在StreetViewPanaroma实例上添加侦听器事件:
- OnStreetViewPanoramaChangeListener
- OnStreetViewPanoramaCameraChangeListener
- OnStreetViewPanoramaClickListener
例:
streetViewPanorama.setOnStreetViewPanoramaClickListener(new StreetViewPanorama.OnStreetViewPanoramaClickListener() {
@Override
public void onStreetViewPanoramaClick(StreetViewPanoramaOrientation streetViewPanoramaOrientation) {
//Enter you logic.
}
});
在该方法内部,我们可以添加任何自定义操作,例如,当方向倾斜超过特定水平时禁用缩放手势。
在下一部分中,我们将在Android应用程序中实现Google Maps Street View。
入门
添加您自己的SHA-1密钥并在Google控制台中生成API密钥。
在Android Manifest.xml应用程序标签中添加以下元数据:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY"
还要添加以下权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" <uses-permission android:name="android.permission.INTERNET"
在build.gradle文件中添加以下依赖项:
implementation 'com.google.android.gms:play-services-maps:15.0.1' implementation 'com.android.support:design:28.0.0-alpha3'
现在,我们都准备在我们的Android应用程序中实现Google Maps Street View。
代码
下面给出了" activity_main.xml"的代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/googleMapStreetView"
android:name="com.google.android.gms.maps.SupportStreetViewPanoramaFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:src="@android:drawable/ic_dialog_map"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
</android.support.constraint.ConstraintLayout>
我们添加了一个FloatingActionButton,它将切换StreetView片段以显示新位置。
MainActivity.java的代码如下:
package com.theitroad.androidgooglemapstreetview;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback;
import com.google.android.gms.maps.StreetViewPanorama;
import com.google.android.gms.maps.SupportStreetViewPanoramaFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.StreetViewPanoramaCamera;
import com.google.android.gms.maps.model.StreetViewPanoramaLocation;
import com.google.android.gms.maps.model.StreetViewPanoramaOrientation;
import com.google.android.gms.maps.model.StreetViewSource;
public class MainActivity extends AppCompatActivity
implements OnStreetViewPanoramaReadyCallback {
private StreetViewPanorama mStreetViewPanorama;
private boolean secondLocation = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportStreetViewPanoramaFragment streetViewFragment =
(SupportStreetViewPanoramaFragment) getSupportFragmentManager()
.findFragmentById(R.id.googleMapStreetView);
streetViewFragment.getStreetViewPanoramaAsync(this);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
secondLocation = !secondLocation;
onStreetViewPanoramaReady(mStreetViewPanorama);
}
});
}
@Override
public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
mStreetViewPanorama = streetViewPanorama;
if (secondLocation) {
streetViewPanorama.setPosition(new LatLng(51.52887, -0.1726073), StreetViewSource.OUTDOOR);
} else {
streetViewPanorama.setPosition(new LatLng(51.52887, -0.1726073));
}
streetViewPanorama.setStreetNamesEnabled(true);
streetViewPanorama.setPanningGesturesEnabled(true);
streetViewPanorama.setZoomGesturesEnabled(true);
streetViewPanorama.setUserNavigationEnabled(true);
streetViewPanorama.animateTo(
new StreetViewPanoramaCamera.Builder().
orientation(new StreetViewPanoramaOrientation(20, 20))
.zoom(streetViewPanorama.getPanoramaCamera().zoom)
.build(), 2000);
streetViewPanorama.setOnStreetViewPanoramaChangeListener(panoramaChangeListener);
}
private StreetViewPanorama.OnStreetViewPanoramaChangeListener panoramaChangeListener =
new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
@Override
public void onStreetViewPanoramaChange(
StreetViewPanoramaLocation streetViewPanoramaLocation) {
Toast.makeText(getApplicationContext(), "Lat: " + streetViewPanoramaLocation.position.latitude + " Lng: " + streetViewPanoramaLocation.position.longitude, Toast.LENGTH_SHORT).show();
}
};
}
我们在同一位置显示两个位置。
一个是室内,另一个是室外。
每当全景图片更改时,都会触发panoramaChangeListener。
它显示当前位置的Toast。

