【问题标题】:map-box compass listener on AndroidAndroid上的地图框指南针监听器
【发布时间】:2018-10-07 20:16:48
【问题描述】:

在地图框中单击指南针时是否可以注册?,我看到MapboxMap.OnCompassAnimationListener 它是一个接口,但是当我实现它时它不起作用(Android) 谢谢

【问题讨论】:

  • 此时罗盘没有暴露的点击监听器。可以开票here

标签: android mapbox


【解决方案1】:

可以拦截点击(我用的是com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.13.0):

CompassView compassView = findViewById(R.id.compassView);
compassView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d(TAG, "Compass clicked");
    }
});

但在此之后,您必须自己执行覆盖的 onClick 逻辑。

【讨论】:

  • 我想,但我找不到 compassView,我最终创建了自己的指南针按钮,到目前为止它似乎工作得很好,谢谢你
【解决方案2】:

“检查”点击的最佳方法是使用触摸侦听器,如果您覆盖 onClickListener,则指南针中的功能将不起作用(动画等) 我找到了方法。 (您可以添加额外的步骤 event.getAction == MotionEvent.ACTION_DOWN)

 mapView.findViewWithTag<View>("compassView")?.setOnTouchListener { v, event ->
                Toast.makeText(context, "touch listener", Toast.LENGTH_SHORT).show()
                false
            }

这会起作用,但如果您更新 mapbox,请确保 compassView 不会更改

【讨论】:

    【解决方案3】:

    以上解决方案都不适合我。 我的 mapbox 版本是 8.2.2。

    这对我有用:

    var onCompassAnimationFinishedLastCallTimeStamp = 0L
    var GUARD_MILLIS = 3000L
    private fun registerCompassOnClickListener() {
        val id = resources.getIdentifier("compassView", "id", requireContext().packageName)
        if (id != 0) {
            val compassView:CompassView = mapView.findViewById(id)
            compassView.injectCompassAnimationListener(object :MapboxMap.OnCompassAnimationListener{
                override fun onCompassAnimation() {
    
                }
    
                override fun onCompassAnimationFinished() {
                    if(System.currentTimeMillis() - onCompassAnimationFinishedLastCallTimeStamp > GUARD_MILLIS)   {
                        onCompassAnimationFinishedLastCallTimeStamp = System.currentTimeMillis()
                        Log.d("compass:::", "compass clicked")
                        MapAnalyticsCollector.onCompassPressed()
                    }
                }
    
            })
        }
    }
    

    重要提示:

    • 我认为如果您提供了自己的 compassView 但尚未尝试过,也可以解决此问题。
    • resources.getIdentifier 是一项昂贵的操作。
    • 这个实现是一种静态的,因为它使用常量名称“compassView”,这可能会在未来的版本中改变,所以如果你升级 mapbox 版本,检查他们是否为此暴露了一个适当的监听器,如果没有,那么至少确保如果需要,更新名称“compassView”。
    • 由于 mapbox 8.2.2 中的一个问题,这个监听器不断被调用,所以我添加了一个时间守卫来过滤额外的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多