一、问题分析
我们在缩放地图时,是想要在某一个位置进行缩放,但是在缩放结束时,由于手指不会同时离开不触摸屏幕,所以会造成缩放结束后地图会有一个移动的效果。这个效果是我们不需要的,这就是我们需要解决的问题。问题分析清楚就应该明白这个肯定是要从 Android 的事件传递机制入手的,我们怎么能让地图在缩放之后不响应最后的那个 MOVE (移动操作)?
二、 思路
(1)百度地图有提供一个接口,我们可以实现这个接口去解决
BaiduMap.OnMapTouchListener
(2)在百度地图上为它添加一个我们重写了事件的 Parent View ,也可以在事件传递到地图之前得到相应事件
前面两个思路经测试都已经解决了这个问题,但是我们需要注意在这两种思路上并不能去拦截事件。如果不能保证将完整的事件拦截下来,就会打乱地图对事件的响应。我们这里只是想让地图不移动,很开兴百度地图也为我们提供了一个方法:true 是可以移动地图,false 是固定地图,这个方式是实时生效的。
public void setScrollGesturesEnabled(boolean var1)
三、解决问题
① 思路一解决
baiduMap.setOnMapTouchListener { val pointerCount = it.pointerCount when (it.action) { MotionEvent.ACTION_DOWN -> { mapView.map.uiSettings.isScrollGesturesEnabled = true } MotionEvent.ACTION_MOVE -> {
//pointerCount 操作的手指个数 if (pointerCount >= 2) { mapView.map.uiSettings.isScrollGesturesEnabled = false } } MotionEvent.ACTION_UP -> { handler.postDelayed({ mapView.map.uiSettings.isScrollGesturesEnabled = true }, 500) } } }
② 思路二解决: 看代码我们是自定义了一个 ViewGroup
class MapOverlayLayout(context: Context?, attrs: AttributeSet?) : RelativeLayout(context, attrs) { private var mMapView: MapView? = null private var isMutilPoint = false private var isOnePoint = true override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { super.onLayout(changed, l, t, r, b) if (changed) setup() } private fun setup() { if (mMapView != null) return for (i in 0 until childCount) { val child = getChildAt(i) if (child != null && child is MapView) { mMapView = child break } } if (childCount > 0 && mMapView == null) Log.e(this.javaClass.simpleName, "未将地图放置在子节点下") } fun setBaiduMap(mapView: MapView) { mMapView = mapView } override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { var isIntercept = false when (ev!!.action) { MotionEvent.ACTION_MOVE -> { mMapView!!.map.uiSettings.isScrollGesturesEnabled = !isMutilPoint && isOnePoint if (ev.pointerCount >= 2) { isMutilPoint = true } if (ev.pointerCount == 1) { isOnePoint = true } } MotionEvent.ACTION_UP -> { isMutilPoint = false isOnePoint = true } } return isIntercept } }
在布局中我们这么使用:
<com.main.map.MapOverlayLayout android:id="@+id/mark_container" android:layout_width="match_parent" android:layout_height="match_parent"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" /> </com.main.map.MapOverlayLayout>
以上就通过两种思路解决了这个问题,如果有帮到你,--------------------------------------------------------------- 我也很开心,哈哈! 下一篇我们将会实现一个效果,如何实现平滑的缩放地图