【发布时间】:2020-05-21 06:23:31
【问题描述】:
我已经实现了一个基于安全目的的应用。此应用程序适用于两个角色,即 A 和 B。两个用户都可以跟踪彼此的位置。对于用户 A,我实现了 Mapbox,对于用户 B,我实现了 Google Map。
对于 A,Mapbox 提供默认的实时导航,对于 B,我使用了信号 R,它提供了用户 A 的位置。所以我可以将标记导航到 A 的特定位置。
我在从 SignalR 获取位置时遇到了问题。但是标记在闪烁。
我已经使用代码来移动标记,如下所示。
private val mMoveCarLocation = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent != null) {
val handler = Handler()
//Code to move car along latitude and longitude
handler.postDelayed(object : Runnable {
override fun run() {
try {
//post again
Log.d("tess", "inside run ")
val targetLocation = Location(LocationManager.GPS_PROVIDER)
val latitude = java.lang.Double.valueOf(
intent.getStringExtra(
GlobalVariables.PROVIDE_A_LATITUDE
)
)
val longitude =
java.lang.Double.valueOf(intent.getStringExtra(GlobalVariables.PROVIDE_A_LONGITUDE))
targetLocation.latitude = latitude
targetLocation.longitude = longitude
animateMarkerNew(targetLocation)
mActivityUserMapBinding!!.txtTime.setText(
intent.getStringExtra(
REMAINING_TIME
)
)
} catch (e: java.lang.Exception) {
Log.d("tess", "call back removed")
//removed callbacks
handler.removeCallbacks(this)
}
}
}, 3000)
}
}
}
标记动画
fun animateMarkerNew(destination: Location) {
if (viewModel.mMarker != null) {
val startPosition = viewModel.mMarker.position
val endPosition = LatLng(destination.latitude, destination.longitude)
val startRotation = viewModel.mMarker.rotation
val latLngInterpolator = UserMapViewModel.LatLngInterpolatorNew.LinearFixed()
val valueAnimator = ValueAnimator.ofFloat(0F, 1F)
valueAnimator.duration = 3000 // duration 3 second
valueAnimator.interpolator = LinearInterpolator()
valueAnimator.addUpdateListener { animation ->
try {
val v = animation.animatedFraction
val newPosition =
latLngInterpolator.interpolate(v, startPosition, endPosition)
viewModel.mMarker.setPosition(newPosition)
handler = Handler()
handler!!.postDelayed(Runnable {
viewModel.googleMap!!.moveCamera(
CameraUpdateFactory.newCameraPosition(
CameraPosition.Builder()
.target(newPosition)
// .zoom(15.5f)
.zoom(17.5f)
.build()
)
)
viewModel.mMarker.rotation = viewModel.getBearing(
startPosition,
LatLng(destination.latitude, destination.longitude)
)
}, 800)
} catch (ex: Exception) {
//I don't care atm..
}
}
valueAnimator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
super.onAnimationEnd(animation)
}
})
valueAnimator.start()
}
}
【问题讨论】:
标签: android google-maps animation kotlin google-maps-markers