【发布时间】:2018-10-07 20:16:48
【问题描述】:
在地图框中单击指南针时是否可以注册?,我看到MapboxMap.OnCompassAnimationListener 它是一个接口,但是当我实现它时它不起作用(Android)
谢谢
【问题讨论】:
-
此时罗盘没有暴露的点击监听器。可以开票here。
在地图框中单击指南针时是否可以注册?,我看到MapboxMap.OnCompassAnimationListener 它是一个接口,但是当我实现它时它不起作用(Android)
谢谢
【问题讨论】:
可以拦截点击(我用的是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 逻辑。
【讨论】:
“检查”点击的最佳方法是使用触摸侦听器,如果您覆盖 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 不会更改
【讨论】:
以上解决方案都不适合我。 我的 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()
}
}
})
}
}
重要提示:
【讨论】: