Как центрировать содержимое Google Map в видимой области, не блокируя его элементами пользовательского интерфейса в AndrAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как центрировать содержимое Google Map в видимой области, не блокируя его элементами пользовательского интерфейса в Andr

Сообщение Anonymous »

Я работаю над приложением Android Auto, использующим MapWithContentTemplate для отображения карты Google. Когда я перемещаю камеру в центр текущего местоположения, она закрывается наложениями пользовательского интерфейса, такими как поле «Информация о приложении», как показано на этом снимке экрана. Текущий автоматический просмотр Android
В моей текущей реализации я использую 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»