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。