腾讯地图实现点击搜索地址功能

本文详细介绍如何集成腾讯地图SDK,包括地图展示、地址搜索、点击交互等功能,并提供完整的代码示例。

一、如图。


 

 

 二、设计详情:地图为腾讯MapView、搜索列表RecycleView 为屏幕长度的一半、点击地图空白处关闭列表、点击地图地点名称、搜索并展示;


三、注意点:腾讯地图显示和定位是分开的、上面的效果实现、必须接入地图和定位两个sdk;

//    腾讯定位
    implementation 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.3.0'
//    腾讯地图
    implementation 'com.tencent.map:tencent-map-vector-sdk:4.3.4'

注意腾讯地图分为2D、3D; 如上为3D效果


四、业务或逻辑关键点 (整体代码在第五点)


地图展示:SupportMapFragment (腾讯提供)、内部封装了MapView、优点:开发者不需要关心地图生命周期;

xml中:

<fragment
    android:id="@+id/map_frag"
    class="com.tencent.tencentmap.mapsdk.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

地址搜索关键代码:

   companion object {
        private const val MSG_SUGGESTION = 10000
    }

 //地址模糊搜索、
    private fun searchAddress(address: String?) {
        if (address.isNullOrEmpty()) return
        val tencentSearch = TencentSearch(this)
        val suggestionParam = SuggestionParam(address, "上海")
        //suggestion也提供了filter()方法和region方法
        //具体说明见文档,或者官网的webservice对应接口
        tencentSearch.suggestion(suggestionParam, object : HttpResponseListener<BaseObject> {
            override fun onSuccess(arg0: Int, arg1: BaseObject?) {
                if (arg1 == null) {
                    return
                }
                progressBar.postDelayed({
                    progressBar.visibility = View.GONE
                    val msg = Message()
                    msg.what = MSG_SUGGESTION
                    //关键点arg1
                    msg.obj = arg1
                    handler.sendMessage(msg)
                }, 350)
            }

            override fun onFailure(arg0: Int, arg1: String?, arg2: Throwable?) {
                progressBar.visibility = View.GONE
            }

        })
    }

    //地址搜索结果预览
    private val handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            if (msg.what == MSG_SUGGESTION) {
                val searchList = (msg.obj as SuggestionResultObject).data
                //RecycViewAdapter
                mapAdapter.addData(searchList)
           
            }
        }
    }

搜索结果实体类(腾讯)

public class SuggestionResultObject extends BaseObject {
    public int count;
    //此处data 为搜索列表结果数据
    public List<SuggestionResultObject.SuggestionData> data;
    //sub_pois 暂无用
    public List<SuggestionResultObject.SubPoi> sub_pois;

    public SuggestionResultObject() {
    }

    public static final class SubPoi extends JsonComposer {
        public String parent_id;
        public String id;
        public String title;
        public String address;
        @Json(
            name = "location"
        )
        public LatLng latLng;
        public String adcode;
        public String city;

        public SubPoi() {
        }
    }

    public static final class SuggestionData extends JsonComposer {
        public String id;
        public String title;
        public String address;
        public String province;
        public String city;
        /** @deprecated */
        public String district;
        //区号
        public String adcode;
        public int type;
        @Json(
            name = "location"
        )
        //经纬度
        public LatLng latLng;
        public float _distance;

        public SuggestionData() {
        }
    }
}

地图默认marker点 定位Icon(红色箭头):

  /**
     * 设置定位图标样式
     */
    private fun setLocMarkerStyle() {
       val locationStyle = MyLocationStyle()
        //创建图标 
        val bitmapDescriptor =
            BitmapDescriptorFactory.fromResource(R.drawable.ic_map_location)
        locationStyle?.icon(bitmapDescriptor)
        //设置定位圆形区域的边框宽度
        locationStyle?.strokeWidth(3)
        //设置圆区域的颜色
        locationStyle?.fillColor(R.color.style)
        //连续定位,但不会移动到地图中心点,并且会跟随设备移动
//        locationStyle = //locationStyle?.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER)
         supportMapFragment = fragmentManger.findFragmentById(R.id.map_frag) as SupportMapFragment
       val tencentMap = supportMapFragment?.map
       tencentMap?.setMyLocationStyle(locationStyle)
    }

点击地址Marker Icon显示:


//地图位置点击回调 、 tencentMap?.setOnMapPoiClickListener(this)
 override fun onClicked(mapPoi: MapPoi?) {
        setMarker(mapPoi?.getPosition(), mapPoi?.getName())  
    }

// latLng 经纬度、name 地址名称
private fun setMarker(latLng: LatLng?, name: String?) {
        marker?.remove()
        val options = MarkerOptions().position(latLng)
        //设置infowindow
        options.title("地址:")
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值