Change the position of a view using Navigation View
Note
This example is a part of the Navigation SDK Examples. You can find the values for all referenced resources in the res
directory. For example, see res/values/strings.xml
for R.string.*
references used in this example.
<?xml version="1.0" encoding="utf-8"?><com.mapbox.navigation.dropin.NavigationViewxmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/navigationView"android:layout_width="match_parent"android:layout_height="match_parent"app:accessToken="@string/mapbox_access_token"/>
package com.mapbox.navigation.examples.preview.dropinui import android.os.Bundleimport android.view.ViewGroupimport androidx.appcompat.app.AppCompatActivityimport androidx.core.view.updateLayoutParamsimport com.mapbox.navigation.core.MapboxNavigationimport com.mapbox.navigation.core.internal.extensions.flowLocationMatcherResultimport com.mapbox.navigation.core.lifecycle.MapboxNavigationObserverimport com.mapbox.navigation.dropin.EmptyBinderimport com.mapbox.navigation.examples.preview.Rimport com.mapbox.navigation.examples.preview.databinding.MapboxActivitySpeedLimitRepositionBindingimport com.mapbox.navigation.examples.preview.databinding.MapboxCustomSpeedLimitViewBindingimport com.mapbox.navigation.ui.base.lifecycle.UIBinderimport com.mapbox.navigation.ui.base.lifecycle.UIComponentimport com.mapbox.navigation.ui.speedlimit.api.MapboxSpeedLimitApiimport com.mapbox.navigation.ui.speedlimit.model.SpeedLimitFormatterimport com.mapbox.navigation.ui.speedlimit.view.MapboxSpeedLimitViewimport kotlinx.coroutines.launch /*** The example demonstrates how to use reposition speed limit view to the bottom of the screen.** Before running the example make sure you have put your access_token in the correct place* inside [app-preview/src/main/res/values/mapbox_access_token.xml]. If not present then add* this file at the location mentioned above and add the following content to it** <?xml version="1.0" encoding="utf-8"?>* <resources xmlns:tools="http://schemas.android.com/tools">* <string name="mapbox_access_token"><PUT_YOUR_ACCESS_TOKEN_HERE></string>* </resources>** The example uses replay location engine to facilitate navigation without physically moving.** How to use the example:* - Start the example* - Grant the location permissions if not already granted* - You will see the speed limit view positioned at the bottom left of the screen*/class RepositionSpeedLimitActivity : AppCompatActivity() { private lateinit var binding: MapboxActivitySpeedLimitRepositionBindingprivate lateinit var speedLimitBinding: MapboxCustomSpeedLimitViewBinding override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = MapboxActivitySpeedLimitRepositionBinding.inflate(layoutInflater)speedLimitBinding = MapboxCustomSpeedLimitViewBinding.inflate(layoutInflater)setContentView(binding.root) binding.navigationView.api.routeReplayEnabled(true) binding.navigationView.customizeViewBinders {// The line of code hides the speed limit view on top leftspeedLimitBinder = EmptyBinder()// The line of code adds a custom speed limit view to empty LeftFrameBinderleftFrameBinder = CustomSpeedLimitBinder(speedLimitBinding.root)}}} /*** Custom speed limit view binder*/class CustomSpeedLimitBinder(private val view: ViewGroup) : UIBinder {override fun bind(viewGroup: ViewGroup): MapboxNavigationObserver {// The empty left frame binder's height is wrap_content by default.// This line of code makes the height change to match_parent. Followed by that// the speed limit view can be positioned at the bottom of the parent.viewGroup.updateLayoutParams { height = 0 }viewGroup.addView(view)return CustomSpeedLimitComponent(view.findViewById(R.id.speedLimitView))}} /*** Custom speed limit component*/class CustomSpeedLimitComponent(private val speedLimitView: MapboxSpeedLimitView,private val speedLimitApi: MapboxSpeedLimitApi = MapboxSpeedLimitApi(SpeedLimitFormatter(speedLimitView.context))) : UIComponent() {override fun onAttached(mapboxNavigation: MapboxNavigation) {super.onAttached(mapboxNavigation)// setTextAppearance is not deprecated in AppCompatTextViewspeedLimitView.setTextAppearance(speedLimitView.context,R.style.DropInSpeedLimitTextAppearance) coroutineScope.launch {mapboxNavigation.flowLocationMatcherResult().collect {val value = speedLimitApi.updateSpeedLimit(it.speedLimit)speedLimitView.render(value)}}}}