手机版微网站,家政服务公司网站建设方案策划书,wordpress全站pjax,班级网站设计素材Osmdroid 天地图 #xff08;二#xff09; 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图… Osmdroid 天地图 二 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图但是还不够不满足基本的使用情况本篇中继续进行功能使用上的完善。 正文 本文中要实现定位和地图的交互功能还有一些体验上的功能首先我们先实现定位功能意思就是一打开地图就定位到当前所在的位置。
一、定位监听 Android实际上有自带的定位监听位置准不准两说起码是有的下面我们来使用一下在MainActivity中增加如下代码 private val TAG MainActivity// 是否定位private var isLocation false// 定位管理器private lateinit var locationManager: LocationManager一个用于打印、一个用于控制是否定位locationManager我们就在onCreate()函数中进行实例化如下所示 // 创建位置管理器实例locationManager getSystemService(Context.LOCATION_SERVICE) as LocationManager代码位置如下图所示 然后实现一个Android原生的定位监听代码如下所示 private val locationListener LocationListener { location - // 处理位置变化val latitude location.latitudeval longitude location.longitudeLog.d(TAG, onLocationChanged: $latitude, $longitude)}然后我们可以写一个开始和停止定位的函数代码如下所示 private var isLocation falseprivate fun startLocation() {if (!isLocation){// 注册位置监听器locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, locationListener)isLocation !isLocation}}private fun stopLocation() {if (isLocation) {// 停止位置更新locationManager.removeUpdates(locationListener)isLocation !isLocation}}你可能会发现这行locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, locationListener)代码报错我们看看源码是怎么样的 这里告诉我们调用这个方法需要在请求了定位权限之后否则就会闪退不信你可以试试看而我们现在明显已经是获取了权限了那么我们也可以增加一个注解点击这一行Alt Enter出现弹窗。 选择标注的这一项则会在方法上方添加一个注解SuppressLint(MissingPermission)这并不是最好的方式但是省事只要你满足那个前提那就不会有问题最后我们在initMap()函数中调用startLocation()如下图所示 同时我们在定位监听回调中调用stopLocation()如下图所示 下面我们运行一下看看是否会触发定位看看控制台是否会打印经纬度。 打印了出来这证明定位监听是有效的下面我们需要改变地图中心。
二、改变地图中心
在MainActivity中增加一个函数代码如下所示 /*** 修改地图中心点*/private fun changeMapCenter(geoPoint: GeoPoint) {Log.d(TAG, changeMapCenter: $geoPoint)binding.mapView.apply {controller.apply {setZoom(14.0)setCenter(geoPoint)}}}当调用changeMapCenter时打印一下然后通过地图控制器修改缩放比例和地图中心接下来就在定位监听中回调中调用changeMapCenter()如下图所示 下面运行一下注意定位可能会有点慢请耐心等待只要定位成功了地图肯定会改变的我们通过日志确认一下 虽然我们改变了地图中心但是没有标识都不知道是哪里下面就添加一个Marker。
三、添加Marker
首先在MainActivity中声明一个变量 // 标记private var mMarker: Marker? null然后我们修改changeMapCenter()函数添加代码如下所示 if (mMarker ! null) {overlays.remove(mMarker)}mMarker Marker(this).apply {title Markerposition geoPoint}// 添加标点overlays.add(mMarker)添加位置如下图所示 此时你再运行一下就能看到一个标点了我就不贴图了容易暴露位置被Gank。
四、地图点击
下面我们来做一个地图点击事件地图点击是在OverlayManager上完成的我们回到initMap()函数增加如下代码 // 覆盖管理器配置overlayManager.apply {tilesOverlay.isEnabled trueadd(object : Overlay() {override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?): Boolean {Log.d(TAG, onSingleTapConfirmed)return super.onSingleTapConfirmed(e, mapView)}})}添加位置如下图所示 从上述代码来看我们启用地图上的图块叠加层并添加一个新的叠加层该叠加层在单击时打印日志下面运行一下随便点击看看控制台是否有日志打印。 出现了日志说明点击有效果实际上还有一个方法如下所示 override fun onSingleTapUp(e: MotionEvent?, mapView: MapView?): Boolean {Log.d(TAG, onSingleTapUp)return super.onSingleTapUp(e, mapView)}这个函数也是单击只不过我在测试的时候同时打印时发现每次点击这两个都会触发而onSingleTapConfirmed()是最后触发的所以就用onSingleTapConfirmed()了。现在点击生效之后我们需要在点击之后改变地图位置那么就可以调用changeMapCenter()函数但是它需要传入一个GeoPoint对象因此我们需要通过mapView去得到这个对象所需要的值也就是经纬度下面我们在onSingleTapConfirmed()回调中增加如下所示代码 // 获取投影对象后进行坐标转换再切换地图中心位置mapView?.projection?.let { proj -val geoPoint proj.fromPixels(e!!.x.toInt(), e.y.toInt()) as GeoPointLog.d(TAG, onSingleTapConfirmed: 切换地图中心位置)changeMapCenter(geoPoint)}添加位置如下图所示 这段代码的含义通过上面的注释应该都清楚了再通俗一点就是点击屏幕的像素进行xy坐标的转换下面再运行一下看看会怎么样 看到这个日志地图就已经切换成功了。
五、其他配置
地图上还有一些其他的配置比如我们可以显示缩放控件。
① 缩放控件
通过zoomController去控制显示的状态。 zoomController.setVisibility(Visibility.SHOW_AND_FADEOUT)比如这里我们设置为SHOW_AND_FADEOUT就是淡入淡出当你点击触摸屏幕时就会在底部出现不触摸屏幕3.5s后控件消失还有两个属性是ALWAYS, NEVER很好理解就是总是显示和从不显示的意思我们之前的代码中是设置从不显示的你可以改成SHOW_AND_FADEOUT。
② Marker更换图标
我们可以通过marker的属性去更改图标首先我们画一个图标在drawable下新建一个ic_marker.xml文件代码如下所示
vector xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:width48dpandroid:height48dpandroid:tint#5AD3E5android:viewportWidth24android:viewportHeight24pathandroid:fillColorandroid:color/whiteandroid:pathDataM12,2L12,2C8.13,2 5,5.13 5,9c0,1.74 0.5,3.37 1.41,4.84c0.95,1.54 2.2,2.86 3.16,4.4c0.47,0.75 0.81,1.45 1.17,2.26C11,21.05 11.21,22 12,22h0c0.79,0 1,-0.95 1.25,-1.5c0.37,-0.81 0.7,-1.51 1.17,-2.26c0.96,-1.53 2.21,-2.85 3.16,-4.4C18.5,12.37 19,10.74 19,9C19,5.13 15.87,2 12,2zM12,11.75c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5S13.38,11.75 12,11.75z //vector然后通过一行代码去设置如下所示 icon ContextCompat.getDrawable(thisMainActivity, R.drawable.ic_marker)位置如下图所示 这样我们就替换掉了默认的那个Marker图标。
③ 添加比例尺
在地图上添加比例尺在initMap()中添加代码如下所示 add(ScaleBarOverlay(binding.mapView).apply {setAlignBottom(true) // 底部对齐setScaleBarOffset(100, 10) // 设置偏移量})添加位置如下图所示 这里的setAlignBottom()设置显示在屏幕底部还有两个方法setCentred()、setAlignRight()根据方法名可以知道是什么意思自行测试。
④ 添加指南针
添加指南针 // 添加指南针add(CompassOverlay(thisMainActivity, binding.mapView).apply {enableCompass()}) 添加位置如下图所示 ⑤ 添加经纬度网格线
添加 显示纬度/经度网格线 // 添加经纬度网格线add(LatLonGridlineOverlay2())添加位置如下图所示 ⑥ 启用旋转手势
启用旋转手势需要配置地图和增加叠加层地图上设置 setMultiTouchControls(true)添加叠加层 // 启用旋转手势add(RotationGestureOverlay(binding.mapView).apply { isEnabled true })添加位置如下图所示 ⑦ 添加小地图
通过小地图叠加层添加根据屏幕的宽高 / 4设置小地图的宽高并且设置小地图瓦片资源代码如下所示 add(MinimapOverlay(thisMainActivity, binding.mapView.tileRequestCompleteHandler).apply {val dm resources.displayMetricswidth dm.widthPixels / 4height dm.heightPixels / 4// 设置小地图资源setTileSource(Config.TDTCIA_W)})添加位置如下图所示 运行效果如下图所示 六、源码
如果对你有所帮助的话不妨欢迎Star和Fork。
源码地址OpenMap
APK下载地址OpenMap1.0.apk 文章转载自: http://www.morning.xptkl.cn.gov.cn.xptkl.cn http://www.morning.lydtr.cn.gov.cn.lydtr.cn http://www.morning.zlchy.cn.gov.cn.zlchy.cn http://www.morning.zcfmb.cn.gov.cn.zcfmb.cn http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn http://www.morning.wfttq.cn.gov.cn.wfttq.cn http://www.morning.wwthz.cn.gov.cn.wwthz.cn http://www.morning.lmdkn.cn.gov.cn.lmdkn.cn http://www.morning.tpdg.cn.gov.cn.tpdg.cn http://www.morning.pwsnr.cn.gov.cn.pwsnr.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.qtrlh.cn.gov.cn.qtrlh.cn http://www.morning.xfxnq.cn.gov.cn.xfxnq.cn http://www.morning.ksqzd.cn.gov.cn.ksqzd.cn http://www.morning.rsjng.cn.gov.cn.rsjng.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.qqklk.cn.gov.cn.qqklk.cn http://www.morning.ppdr.cn.gov.cn.ppdr.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn http://www.morning.dmzqd.cn.gov.cn.dmzqd.cn http://www.morning.qbjgw.cn.gov.cn.qbjgw.cn http://www.morning.zcqgf.cn.gov.cn.zcqgf.cn http://www.morning.rjfr.cn.gov.cn.rjfr.cn http://www.morning.npxcc.cn.gov.cn.npxcc.cn http://www.morning.slqzb.cn.gov.cn.slqzb.cn http://www.morning.fqnql.cn.gov.cn.fqnql.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.wpcfm.cn.gov.cn.wpcfm.cn http://www.morning.xpwdf.cn.gov.cn.xpwdf.cn http://www.morning.rkfxc.cn.gov.cn.rkfxc.cn http://www.morning.lxjxl.cn.gov.cn.lxjxl.cn http://www.morning.zlnkq.cn.gov.cn.zlnkq.cn http://www.morning.hnhkz.cn.gov.cn.hnhkz.cn http://www.morning.ljjmr.cn.gov.cn.ljjmr.cn http://www.morning.hous-e.com.gov.cn.hous-e.com http://www.morning.gzzncl.cn.gov.cn.gzzncl.cn http://www.morning.zkjqj.cn.gov.cn.zkjqj.cn http://www.morning.dqcpm.cn.gov.cn.dqcpm.cn http://www.morning.mrfbp.cn.gov.cn.mrfbp.cn http://www.morning.cljmx.cn.gov.cn.cljmx.cn http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn http://www.morning.rkqqf.cn.gov.cn.rkqqf.cn http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn http://www.morning.qsmdd.cn.gov.cn.qsmdd.cn http://www.morning.ykshx.cn.gov.cn.ykshx.cn http://www.morning.mrttc.cn.gov.cn.mrttc.cn http://www.morning.lswgs.cn.gov.cn.lswgs.cn http://www.morning.yhdqq.cn.gov.cn.yhdqq.cn http://www.morning.tqsmc.cn.gov.cn.tqsmc.cn http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn http://www.morning.qhqgk.cn.gov.cn.qhqgk.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.tnrdz.cn.gov.cn.tnrdz.cn http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.xstfp.cn.gov.cn.xstfp.cn http://www.morning.prjns.cn.gov.cn.prjns.cn http://www.morning.qbwyd.cn.gov.cn.qbwyd.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.c7625.cn.gov.cn.c7625.cn http://www.morning.tsflw.cn.gov.cn.tsflw.cn http://www.morning.ntqjh.cn.gov.cn.ntqjh.cn http://www.morning.zcxjg.cn.gov.cn.zcxjg.cn http://www.morning.dpgdj.cn.gov.cn.dpgdj.cn http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.zzgtdz.cn.gov.cn.zzgtdz.cn http://www.morning.zxdhp.cn.gov.cn.zxdhp.cn http://www.morning.rfhm.cn.gov.cn.rfhm.cn http://www.morning.ckwxs.cn.gov.cn.ckwxs.cn http://www.morning.mgskc.cn.gov.cn.mgskc.cn http://www.morning.prmbn.cn.gov.cn.prmbn.cn http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn http://www.morning.ctrkh.cn.gov.cn.ctrkh.cn http://www.morning.kmcby.cn.gov.cn.kmcby.cn http://www.morning.ybshj.cn.gov.cn.ybshj.cn