如何通过点击而不是长按来移动标记

问题描述 投票:0回答:2

我想要什么?

当用户点击标记时,其图像应该发生变化,并且用户应该能够移动标记,并且我应该能够获取纬度和经度。下面是需求视频。

到目前为止我已经尝试过什么?

我尝试实现默认标记拖动侦听器,但它仅适用于长按。

我在堆栈溢出上查看了类似的问题,但没有运气。

尝试过地面覆盖,但运气不佳。

enter image description here

那么我怎样才能实现这种行为,任何提示都会受到赞赏。已经有一个应用程序可以做到这一点,所以这应该是可能的。

android google-maps google-maps-markers drag
2个回答
0
投票

根据文档,您需要使用:

GoogleMap.OnMarkerClickListener
public static interface GoogleMap.OnMarkerClickListener

定义单击或点击标记时调用的方法的签名。

使用公共方法:

abstract boolean onMarkerClick(Marker marker)

单击或点击标记时调用。

代替

GoogleMap.OnMapLongClickListener
public static interface GoogleMap.OnMapLongClickListener

使用公共方法:

公共抽象无效onMapLongClickLatLng点) 当用户在地图上做出长按手势时调用,但前提是地图的任何覆盖层都没有处理该手势。该方法的实现始终在 Android UI 线程上调用。


0
投票

我上周偶然发现了这个,我想我找到了解决方案: 我们需要拦截触摸事件并编写自己的拖动算法。要拦截onTouchEvent,我们需要用自定义视图包装它来拦截它。

class TouchableWrapper(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) {
    var touchListener: OnTouchListener? = null

    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        val result = touchListener?.onTouch(this, ev)
        return if (result == false) super.dispatchTouchEvent(ev)
        else result == true
    }
}

包裹你的地图片段:

<com.example.mapplayground.presentation.utils.TouchableWrapper
        android:id="@+id/map_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </com.example.mapplayground.presentation.utils.TouchableWrapper>

然后我们可以创建自定义触摸监听器,然后分配给可触摸包装器

class CustomOnTouchListener: View.OnTouchListener {
    override fun onTouch(v: View, event: MotionEvent): Boolean {
        when(event.action){
            MotionEvent.ACTION_DOWN ->{
                // do something like recording initial touch point
                return true // if consumed, if not, it will propagated to the parent
            }
            MotionEvent.ACTION_MOVE -> {
                // do something
                
                return true // if consumed, if not, it will propagated to the parent
            }
            MotionEvent.ACTION_UP ->{
                // do something to detect if its click or not
            }
        }
        
        return false // propagate to parent eventually
    }
}

touchableWrapper.touchListener = CustomTouchListener()

这是我的例子中侦听器的完整代码: https://gist.github.com/Humayung/30623f3fed1e07794cc01a98c2fae97f

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.