zoukankan      html  css  js  c++  java
  • 百度地图缩放 — 放开手指时地图位置移动问题解决

    一、问题分析

      我们在缩放地图时,是想要在某一个位置进行缩放,但是在缩放结束时,由于手指不会同时离开不触摸屏幕,所以会造成缩放结束后地图会有一个移动的效果。这个效果是我们不需要的,这就是我们需要解决的问题。问题分析清楚就应该明白这个肯定是要从 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>

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

  • 相关阅读:
    【iBoard电子学堂开发板例程】【12个 stm32 例程发布】
    【iCore双核心组合是开发板例程】【12个 verilog 中级实验例程发布】
    【新产品发布】【iHMI43 智能液晶模块 2013 版】
    【新产品发布】【EVC8001 磁耦隔离式 USB 转 RS-485】
    【iHMI43真彩液晶模块】发布新版 DEMO 软件包,版本号为 0.14
    【新产品发布】【iCore2 ARM / FPGA 双核心板】
    急性淋巴瘤化疗术后高热不退案
    产后便秘案
    药疹治案
    胃癌化疗后急救案
  • 原文地址:https://www.cnblogs.com/aimqqroad-13/p/9505946.html
Copyright © 2011-2022 走看看