Android 高德地图API(详细步骤+源码)二

2021-03-05 10:35:18 浏览数 (1)

四、显示地图

下面改变一下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) {

    }

下面运行之后点击一下这个右下角的浮动按钮。

数据就打印出来了。

下一篇

Android 高德地图API(详细步骤 源码)三

0 人点赞