В моей текущей реализации я использую googleMap.moveCamera() для центрирования карты по текущему местоположению, но это приводит к тому, что текущее местоположение блокируется наложениями. Вот соответствующая часть моего кода:
Код: Выделить всё
class SurfaceRenderer(
private val carContext: CarContext,
lifecycle: Lifecycle
) : DefaultLifecycleObserver, ILocationReceiver {
companion object {
private const val TAG = "SurfaceRenderer"
private const val MSG_RENDER_FRAME = 1
}
private var mSurface: Surface? = null
private var mVisibleArea: Rect? = null
private var mStableArea: Rect? = null
private var googleMap: GoogleMap? = null
private lateinit var virtualDisplay: VirtualDisplay
private var presentation: Presentation? = null
private var isBound = false
private val mCarContext: CarContext = carContext
private fun isSurfaceReady(surfaceContainer: SurfaceContainer): Boolean {
return surfaceContainer.surface != null && surfaceContainer.dpi != 0 && surfaceContainer.height != 0 && surfaceContainer.width != 0
}
private val mSurfaceCallback = object : SurfaceCallback {
override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
synchronized(this@SurfaceRendererNew) {
if (!isSurfaceReady(surfaceContainer)) {
return
}
Log.i(TAG, "Surface available $surfaceContainer")
mSurface?.release()
mSurface = surfaceContainer.surface
virtualDisplay = carContext
.getSystemService(DisplayManager::class.java)
.createVirtualDisplay(
"Map",
surfaceContainer.width,
surfaceContainer.height,
surfaceContainer.dpi,
surfaceContainer.surface,
DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
)
presentation = Presentation(carContext, virtualDisplay.display)
val mapView = MapView(carContext)
mapView.onCreate(null)
mapView.onStart()
mapView.onResume()
presentation!!.setContentView(mapView)
presentation!!.show()
mapView.getMapAsync { google ->
googleMap = google
googleMap!!.mapType = GoogleMap.MAP_TYPE_NORMAL
if (ActivityCompat.checkSelfPermission(
carContext,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(
carContext,
Manifest.permission.ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED
) {
googleMap!!.isMyLocationEnabled = true
}
}
googleMap?.projection?.visibleRegion
renderFrame()
}
}
override fun onVisibleAreaChanged(visibleArea: Rect) {
synchronized(this@SurfaceRendererNew) {
Log.i(TAG, "Visible area changed: $visibleArea")
mVisibleArea = visibleArea
renderFrame()
}
}
override fun onStableAreaChanged(stableArea: Rect) {
synchronized(this@SurfaceRendererNew) {
Log.i(TAG, "Stable area changed: $stableArea")
mStableArea = stableArea
//moveCurrentLocationToStableAreaCenter()
renderFrame()
}
}
override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) {
synchronized(this@SurfaceRendererNew) {
Log.i(TAG, "Surface destroyed")
mSurface?.release()
mSurface = null
}
}
}
private val mHandler = Handler(Looper.getMainLooper()) {
when (it.what) {
MSG_RENDER_FRAME -> {
doRenderFrame(); true}
else -> {false}
}
}
init {
lifecycle.addObserver(this)
}
override fun onCreate(owner: LifecycleOwner) {
Log.i(TAG, "SurfaceRenderer created")
mCarContext.getCarService(AppManager::class.java).setSurfaceCallback(mSurfaceCallback)
}
private fun renderFrame() {
mHandler.sendEmptyMessage(MSG_RENDER_FRAME)
}
private fun doRenderFrame() {
if (mSurface == null || mSurface?.isValid == false) return
}
override fun locationUpdated(location: Location) {
Log.d(TAG, "Getting current location $location")
val cameraUpdate = CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude, location.longitude), 15f)
googleMap?.moveCamera(cameraUpdate)
//moveCurrentLocationToVisibleAreaCenter(LatLng(location.latitude, location.longitude))
}
private fun moveCurrentLocationToVisibleAreaCenter(currentLocation: LatLng) {
val googleMap = googleMap ?: return
val projection = googleMap.projection
val currentLocationScreenPoint = projection.toScreenLocation(currentLocation) ?: return
val visibleAreaCenterX = mVisibleArea?.centerX() ?: return
val visibleAreaCenterY = mVisibleArea?.centerY() ?: return
val visibleAreaCenterPoint = Point(visibleAreaCenterX, visibleAreaCenterY)
val offsetX = visibleAreaCenterPoint.x - currentLocationScreenPoint.x
val offsetY = visibleAreaCenterPoint.y - currentLocationScreenPoint.y
val adjustedScreenPoint = Point(
currentLocationScreenPoint.x + offsetX,
currentLocationScreenPoint.y + offsetY
)
val adjustedLatLng = projection.fromScreenLocation(adjustedScreenPoint)
adjustedLatLng?.let {
val cameraUpdate = CameraUpdateFactory.newLatLngZoom(it, 10f)
googleMap.moveCamera(cameraUpdate)
}
}
}
Итак, как я могу настроить содержимое камеры или карты так, чтобы оно оставалось полностью видимым в полезной области карты, даже если в Android Auto есть наложения пользовательского интерфейса?
Любая помощь или предложения буду очень признателен!
Подробнее здесь: https://stackoverflow.com/questions/790 ... cked-by-ui
Мобильная версия