百度地图缩放 — 放开手指时地图位置移动问题解决

1、问题分析

  咱们在缩放地图时,是想要在某一个位置进行缩放,可是在缩放结束时,因为手指不会同时离开不触摸屏幕,因此会形成缩放结束后地图会有一个移动的效果。这个效果是咱们不须要的,这就是咱们须要解决的问题。问题分析清楚就应该明白这个确定是要从 Android 的事件传递机制入手的,咱们怎么能让地图在缩放以后不响应最后的那个 MOVE (移动操做)?html

2、 思路

(1)百度地图有提供一个接口,咱们能够实现这个接口去解决java

BaiduMap.OnMapTouchListener

(2)在百度地图上为它添加一个咱们重写了事件的 Parent View ,也能够在事件传递到地图以前获得相应事件android

  前面两个思路经测试都已经解决了这个问题,可是咱们须要注意在这两种思路上并不能去拦截事件。若是不能保证将完整的事件拦截下来,就会打乱地图对事件的响应。咱们这里只是想让地图不移动,很开兴百度地图也为咱们提供了一个方法:true 是能够移动地图,false 是固定地图,这个方式是实时生效的。api

public void setScrollGesturesEnabled(boolean var1)

3、解决问题

  ① 思路一解决ide

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
    }
}

  在布局中咱们这么使用:post

<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>

  以上就经过两种思路解决了这个问题,若是有帮到你,---------------------------------------------------------------   我也很开心,哈哈! 下一篇咱们将会实现一个效果,如何实现平滑的缩放地图测试

相关文章
相关标签/搜索