四、显示地图
下面改变一下activity_main.xml
代码语言:txt复制<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<!--地图-->
<com.amap.api.maps.MapView
android:id="@ id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
我删除了TextView,改变了外部的父布局,进入到MainActivity中。按照下图进行改变,你可以将无用的代码删除掉。
然后增加地图生命周期的管理方法。
代码语言:txt复制 @Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mapView.onSaveInstanceState(outState);
}
下面重新运行一下,不出意外你就能看到地图了。
不出意外,你的页面会和我这个一毛一样,默认就是定位在北京。百度和腾讯也都是如此。
五、显示当前定位地图
很显然,默认的地图不能满足我们的要求,那么就需要开发者自行去设置了,比如我现在在深圳福田区,那么我就要定位到当前所在地这里才行,来看看要怎么做吧。
现在MainActivity中新增两个成员变量
代码语言:txt复制 //地图控制器
private AMap aMap = null;
//位置更改监听
private OnLocationChangedListener mListener;
然后新增一个initMap()方法,用于初始化地图
代码语言:txt复制 /**
* 初始化地图
* @param savedInstanceState
*/
private void initMap(Bundle savedInstanceState) {
mapView = findViewById(R.id.map_view);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mapView.onCreate(savedInstanceState);
//初始化地图控制器对象
aMap = mapView.getMap();
// 设置定位监听
aMap.setLocationSource(this);
// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.setMyLocationEnabled(true);
}
同样要在onCreate中调用
同时,MainActivity要实现LocationSource
然后重写里面的两个方法在activate()和deactivate()。
代码如下:
代码语言:txt复制 /**
* 激活定位
*/
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
if (mLocationClient == null) {
mLocationClient.startLocation();//启动定位
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mLocationClient != null) {
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
mLocationClient = null;
}
然后只要在定位结果的回调中,进行数据源的更改就可以实现地图的定位了。
下面运行一下吧。
可以看到已经到了福田区,只不过这个比例尺有点小,你可以点击右侧的 按钮放大一些,就能看得清楚些。
六、地图设置
① 修改自定义定位图标
修改定位图标,这里就需要一个样式配置。在MainActivity中新增
代码语言:txt复制 //定位样式
private MyLocationStyle myLocationStyle = new MyLocationStyle();
然后在initMap()方法中配置。
代码语言:txt复制 // 自定义定位蓝点图标
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.gps_point));
// 自定义精度范围的圆形边框颜色 都为0则透明
myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));
// 自定义精度范围的圆形边框宽度 0 无宽度
myLocationStyle.strokeWidth(0);
// 设置圆形的填充颜色 都为0则透明
myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));
//设置定位蓝点的Style
aMap.setMyLocationStyle(myLocationStyle);
② 设置缩放等级
然后再修改缩放等级,
代码语言:txt复制 //设置最小缩放等级为16 ,缩放级别范围为[3, 20]
aMap.setMinZoomLevel(12);
最终设置如下图所示:
下面运行一下:
OK,这就改好了。
③ 开启室内地图
代码语言:txt复制 aMap.setMinZoomLevel(20);
//开启室内地图
aMap.showIndoorMap(true);
运行
④ 地图控件设置
代码语言:txt复制 //定义一个UiSettings对象
private UiSettings mUiSettings;
隐藏缩放按钮
代码语言:txt复制 //实例化UiSettings类对象
mUiSettings = aMap.getUiSettings();
//隐藏缩放按钮
mUiSettings.setZoomControlsEnabled(false);
比例尺控件
代码语言:txt复制 //显示比例尺 默认不显示
mUiSettings.setScaleControlsEnabled(true);
七、获取POI数据
POI (Point of Interest,兴趣点)。在地图表达中,一个 POI 可代表一栋大厦、一家商铺、一处景点等等。通过POI搜索,完成找餐馆、找景点、找厕所等等的功能。
首先先在app的build.gradle中添加依赖
代码语言:txt复制 //Material库
implementation 'com.google.android.material:material:1.2.0'
然后修改activity_main.xml
代码语言:txt复制<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--地图-->
<com.amap.api.maps.MapView
android:id="@ id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!--浮动按钮-->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@ id/fab_poi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_margin="20dp"
android:clickable="true"
android:onClick="queryPOI"
android:src="@drawable/icon_favorite_red"
android:visibility="gone"
app:backgroundTint="#FFF"
app:backgroundTintMode="screen"
app:hoveredFocusedTranslationZ="18dp"
app:pressedTranslationZ="18dp" />
</RelativeLayout>
浮动按钮中有一个图标
在res/drawable下新建一个icon_favorite_red.xml
代码语言:txt复制<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#EF5350"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@android:color/white"
android:pathData="M13.35,20.13c-0.76,0.69 -1.93,0.69 -2.69,-0.01l-0.11,-0.1C5.3,15.27 1.87,12.16 2,8.28c0.06,-1.7 0.93,-3.33 2.34,-4.29 2.64,-1.8 5.9,-0.96 7.66,1.1 1.76,-2.06 5.02,-2.91 7.66,-1.1 1.41,0.96 2.28,2.59 2.34,4.29 0.14,3.88 -3.3,6.99 -8.55,11.76l-0.1,0.09z" />
</vector>
回到MainActivity
代码语言:txt复制 //POI查询对象
private PoiSearch.Query query;
//POI搜索对象
private PoiSearch poiSearch;
//城市码
private String cityCode = null;
//浮动按钮
private FloatingActionButton fabPOI;
然后在onCreate中
代码语言:txt复制 fabPOI = findViewById(R.id.fab_poi);
然后在onLocationChanged进行赋值显示。
然后添加一个queryPOI()方法,这个方法对应了xml中浮动按钮的onClick的值。
代码语言:txt复制 /**
* 浮动按钮点击查询附近POI
*
* @param view
*/
public void queryPOI(View view) {
//构造query对象
query = new PoiSearch.Query("购物", "", cityCode);
// 设置每页最多返回多少条poiitem
query.setPageSize(10);
//设置查询页码
query.setPageNum(1);
//构造 PoiSearch 对象
poiSearch = new PoiSearch(this, query);
//设置搜索回调监听
poiSearch.setOnPoiSearchListener(this);
//发起搜索附近POI异步请求
poiSearch.searchPOIAsyn();
}
在这个方法里面对query和poiSearch进行配置,然后发起搜索附近POI异步请求。
下面就要实现PoiSearch.OnPoiSearchListener
然后重写里面的onPoiSearched和onPoiItemSearched,方法如下:
代码语言:txt复制 /**
* POI搜索返回
*
* @param poiResult POI所有数据
* @param i
*/
@Override
public void onPoiSearched(PoiResult poiResult, int i) {
//解析result获取POI信息
//获取POI组数列表
ArrayList<PoiItem> poiItems = poiResult.getPois();
for (PoiItem poiItem : poiItems) {
Log.d("MainActivity", " Title:" poiItem.getTitle() " Snippet:" poiItem.getSnippet());
}
}
/**
* POI中的项目搜索返回
*
* @param poiItem 获取POI item
* @param i
*/
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
下面运行之后点击一下这个右下角的浮动按钮。
数据就打印出来了。