文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

android 地图自定义mark,以高德地图为例

2022-06-06 13:33

关注

配置key等基本操作就不赘述了,一个老弟问了,我就直接贴代码,简单梳理一下,有问题可以留言。

 var map: MapView? = null
    var mAMap: AMap? = null
    var myLocationStyle: MyLocationStyle? = null
    //用于定位
    var mlocationClient: AMapLocationClient? = null
    var mLocationOption: AMapLocationClientOption? = null
    var mLocationListener: AMapLocationListener? = null
    var listlocal: List = listOf()
  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val rootView = inflater!!.inflate(R.layout.fragment_local_kot, null)
        map = rootView?.findViewById(R.id.map)
        map!!.onCreate(savedInstanceState)// 此方法必须重写
        mAMap = map!!.getMap()
        mAMap!!.moveCamera(CameraUpdateFactory.zoomTo(14f))
        myLocationStyle = MyLocationStyle()//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
        myLocationStyle!!.interval(1000) //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
        myLocationStyle!!.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE)
        mAMap!!.setMyLocationStyle(myLocationStyle)//设置定位蓝点的Style
        mAMap!!.getUiSettings()!!.isMyLocationButtonEnabled = true// 设置默认定位按钮是否显示
//  mAMap!!.uiSettings.isZoomControlsEnabled = false//缩放放大按钮是否显示
        mAMap?.uiSettings?.zoomPosition = AMapOptions.LOGO_POSITION_BOTTOM_LEFT
        mAMap?.uiSettings?.isZoomControlsEnabled = false
        mAMap!!.isMyLocationEnabled = true// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
        //用于定位的方法
        mlocationClient = AMapLocationClient(context)
        mLocationOption = AMapLocationClientOption()
        //  mLocationListener = AMapLocationListener { }
        mlocationClient?.setLocationListener(this)
        mLocationOption?.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy)
        mLocationOption?.setInterval(1000)
        mlocationClient?.setLocationOption(mLocationOption)
        mlocationClient?.startLocation();
        mPresent = LocalPresent(activity as Context)
        mPresent?.attachView(this)
        
        mAMap!!.setOnMarkerClickListener(this)
        mAMap?.setOnMyLocationChangeListener(this)
        return rootView
    }
//getAroundUser是通过自己服务器获得的接口返回数据,getAroundUser是自己起的方法名
    override fun getAroundUser(list: MutableList) {
        mAMap!!.setOnMarkerClickListener(this)
        mAMap?.clear()
        for (index in 0..(list?.size - 1)) {
            var view: View = View.inflate(context, R.layout.view_map_mark, null)
            var iv_header = view.findViewById(R.id.iv_header)
            var rl_mark = view.findViewById(R.id.rl_mark)
            if (list.get(index).type == 1) {
                rl_mark.setBackgroundResource(R.mipmap.position_bg_wc)
            } else if (list.get(index).id.equals(MyApplication.getInstance().user.id)) {
                rl_mark.setBackgroundResource(R.mipmap.position_bg_red)
            } else {
                rl_mark.setBackgroundResource(R.mipmap.position_bg_green)
            }
            val options = RequestOptions()
            options.centerCrop().placeholder(R.mipmap.default_avatar).error(R.mipmap.default_avatar)
            if (!list?.get(index)?.head_pic?.contains("http")) {
                Glide.with(this).asBitmap()
                        .load(UrlUtils.APIHTTP + "/" + list.get(index).head_pic)
                        .apply(options)
                        .into(object : SimpleTarget() {
                            override fun onResourceReady(resource: Bitmap, transition: Transition?) {
                                iv_header.imageBitmap = resource
                                var bitmap: Bitmap = convertViewToBitmap(view)
                                val latLng = LatLng(list.get(index).latitude, list.get(index).longitude)
                                drawMarkerOnMap(latLng, bitmap, list.get(index).id)
                            }
                            override fun onLoadFailed(errorDrawable: Drawable?) {
                                super.onLoadFailed(errorDrawable)
                                var bitmap: Bitmap = convertViewToBitmap(view)
                                val latLng = LatLng(list.get(index).latitude, list.get(index).longitude)
                                drawMarkerOnMap(latLng, bitmap, list.get(index).id)
                            }
                        })
            } else {
                Glide.with(this).asBitmap()
                        .load(list.get(index).head_pic)
                        .apply(options)
                        .into(object : SimpleTarget() {
                            override fun onResourceReady(resource: Bitmap, transition: Transition?) {
                                iv_header.imageBitmap = resource
                                var bitmap: Bitmap = convertViewToBitmap(view)
                                val latLng = LatLng(list.get(index).latitude, list.get(index).longitude)
                                drawMarkerOnMap(latLng, bitmap, list.get(index).id)
                            }
                            override fun onLoadFailed(errorDrawable: Drawable?) {
                                super.onLoadFailed(errorDrawable)
                                var bitmap: Bitmap = convertViewToBitmap(view)
                                val latLng = LatLng(list.get(index).latitude, list.get(index).longitude)
                                drawMarkerOnMap(latLng, bitmap, list.get(index).id)
                            }
                        })
            }
        }
        listlocal = list
    }
//view 转bitmap
    fun convertViewToBitmap(view: View): Bitmap {
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
        view.layout(0, 0, view.measuredWidth, view.measuredHeight)
        view.buildDrawingCache()
        return view.drawingCache
    }
    
    private fun drawMarkerOnMap(point: LatLng?, markerIcon: Bitmap, id: String): Marker? {
        return if (mAMap != null && point != null) {
            mAMap?.addMarker(MarkerOptions().anchor(0.5f, 1f)
                    .position(point)
                    .title(id)
                    .icon(BitmapDescriptorFactory.fromBitmap(markerIcon)))
        } else null
    }
    var longitude = ""
    var latitude = ""
    override fun onLocationChanged(p0: AMapLocation?) {
        if (p0 != null) {
            if (p0.errorCode == 0) {
                //从location对象中获取经纬度信息,地址描述信息,建议拿到位置之后调用逆地理编码接口获取(获取地址描述数据章节有介绍)
 //记得有定位失败的情况,获得自己的经纬度,可以去请求附近人的数据,给后台传数据等
                longitude = p0?.longitude.toString()
                latitude = p0?.latitude.toString()       
                }
            } else {
                //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                Log.e("AmapError", "location Error, ErrCode:"
                        + p0.getErrorCode() + ", errInfo:"
                        + p0.getErrorInfo());
            }
        }
    }
     var curShowWindowMarker: Marker? = null
    
    override fun onMarkerClick(p0: Marker?): Boolean {
        var local: LocalBean? = null
        for (index in 0..(listlocal.size - 1)) {
            if (listlocal.get(index).id.equals(p0?.title)) {
                local = listlocal.get(index)
            }
        }
        curShowWindowMarker = p0
        p0?.hideInfoWindow()
        val intent = Intent(activity, PersonHomeActivity::class.java)
        intent.putExtra("user_id", local?.id)
        startActivityForResult(intent, 66)
        return true
    }
 override fun onMyLocationChange(p0: Location?) {
    }
        override fun onCameraChange(p0: CameraPosition?) {
    }
    override fun onCameraChangeFinish(p0: CameraPosition?) {
    }
    //必须重写的几个方法
     override fun onResume() {
        super.onResume()
        map!!.onResume()
        }
     override fun onDestroy() {
        super.onDestroy()
        map!!.onDestroy()
    }
     override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        map?.onSaveInstanceState(outState)
    }
     override fun onPause() {
        super.onPause()
        map!!.onPause()
    }

注:
1、你的activity或者fragment用来管理地图的,需要继承AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.OnMyLocationChangeListener, AMapLocationListener这几个接口。
2、R.layout.view_map_mark 就是你的自定义mark布局
3、R.layout.fragment_local_kot 就是你的地图布局

R.layout.view_map_mark


R.layout.fragment_local_kot



作者:龙腾腾


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯