mapbox / mapbox-gl-native

Interactive, thoroughly customizable maps in native Android, iOS, macOS, Node.js, and Qt applications, powered by vector tiles and OpenGL
https://mapbox.com/mobile
Other
4.36k stars 1.33k forks source link

Setting my location view drawables in xml causes entire object to tint #9393

Closed cammace closed 7 years ago

cammace commented 7 years ago

When setting a location layer foreground or bearing drawable in xml, the icon gets fully tinted before displaying to the user.

<com.mapbox.mapboxsdk.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:mapbox_cameraZoom="14"
        app:mapbox_styleUrl="@string/mapbox_style_mapbox_streets"
        app:mapbox_myLocationDrawable="@drawable/ic_car_top"
        app:mapbox_myLocationTintColor="@color/mapbox_navigation_route_layer_congestion_red"
        app:mapbox_myLocationBearingDrawable="@drawable/ic_car_top"/>

@tobrun @Guardiola31337

Frankelycp commented 4 years ago

Hi guys, can someone help me to put a annotation like that car in my project?? idk how to do it.

this is the code im testing.

`/*

package com.raywenderlich.where2go

import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.Intent import android.location.Location import android.os.Bundle import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity import android.util.Log import android.widget.Toast import com.google.android.gms.common.api.ApiException import com.google.android.gms.common.api.ResolvableApiException import com.google.android.gms.location. import com.mapbox.android.core.location.LocationEngine import com.mapbox.android.core.location.LocationEngineListener import com.mapbox.android.core.location.LocationEnginePriority import com.mapbox.android.core.location.LocationEngineProvider import com.mapbox.android.core.permissions.PermissionsListener import com.mapbox.android.core.permissions.PermissionsManager import com.mapbox.api.directions.v5.models.DirectionsResponse import com.mapbox.api.directions.v5.models.DirectionsRoute import com.mapbox.geojson.Point import com.mapbox.mapboxsdk.Mapbox import com.mapbox.mapboxsdk.camera.CameraUpdateFactory import com.mapbox.mapboxsdk.geometry.LatLng import com.mapbox.mapboxsdk.location.LocationComponent import com.mapbox.mapboxsdk.location.LocationComponentOptions import com.mapbox.mapboxsdk.location.modes.CameraMode import com.mapbox.mapboxsdk.maps.MapboxMap import com.mapbox.mapboxsdk.maps.OnMapReadyCallback import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute import kotlinx.android.synthetic.main.activity_main. import retrofit2.Call import retrofit2.Callback import retrofit2.Response

class MainActivity : AppCompatActivity(), PermissionsListener, LocationEngineListener, OnMapReadyCallback { //MapboxMap.OnMapClickListener

//1 val REQUEST_CHECK_SETTINGS = 1 var settingsClient: SettingsClient? = null

//2 lateinit var map: MapboxMap lateinit var permissionManager: PermissionsManager var originLocation: Location? = null

var locationEngine: LocationEngine? = null var locationComponent: LocationComponent? = null

var navigationMapRoute: NavigationMapRoute? = null var currentRoute: DirectionsRoute? = null

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Mapbox.getInstance(this, "key" ) setContentView(R.layout.activity_main) mapbox.onCreate(savedInstanceState) mapbox.getMapAsync(this) settingsClient = LocationServices.getSettingsClient(this) btnNavigate.hide()

btnNavigate.setOnClickListener {
  val navigationLauncherOptions = NavigationLauncherOptions.builder() //1
      .directionsRoute(currentRoute) //2
      .shouldSimulateRoute(false) //3
      .build()

  NavigationLauncher.startNavigation(this, navigationLauncherOptions) //4

}

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data)

if (requestCode == REQUEST_CHECK_SETTINGS) {
  if (resultCode == Activity.RESULT_OK) {
    enableLocation()
  } else
    if (resultCode == Activity.RESULT_CANCELED) {
      finish()
    }
}

}

@SuppressWarnings("MissingPermission") override fun onStart() { super.onStart() if (PermissionsManager.areLocationPermissionsGranted(this)) { locationEngine?.requestLocationUpdates() locationComponent?.onStart() }

mapbox.onStart()

}

override fun onResume() { super.onResume() mapbox.onResume() }

override fun onPause() { super.onPause() mapbox.onPause() }

override fun onStop() { super.onStop() locationEngine?.removeLocationUpdates() locationComponent?.onStop() mapbox.onStop() }

override fun onDestroy() { super.onDestroy() locationEngine?.deactivate() mapbox.onDestroy() }

override fun onLowMemory() { super.onLowMemory() mapbox.onLowMemory() }

override fun onSaveInstanceState(outState: Bundle?) { super.onSaveInstanceState(outState) if (outState != null) { mapbox.onSaveInstanceState(outState) } }

override fun onExplanationNeeded(permissionsToExplain: MutableList?) { Toast.makeText(this, "This app needs location permission to be able to show your location on the map", Toast.LENGTH_LONG).show() }

override fun onPermissionResult(granted: Boolean) { if (granted) { enableLocation() } else { Toast.makeText(this, "User location was not granted", Toast.LENGTH_LONG).show() finish() } }

override fun onLocationChanged(location: Location?) { location?.run { originLocation = this setCameraPosition(this) } }

override fun onConnected() { }

override fun onMapReady(mapboxMap: MapboxMap?) { //1 map = mapboxMap ?: return //2 val locationRequestBuilder = LocationSettingsRequest.Builder().addLocationRequest(LocationRequest() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) ) //3 val locationRequest = locationRequestBuilder?.build()

settingsClient?.checkLocationSettings(locationRequest)?.run {
  addOnSuccessListener {
    enableLocation()
  }

  addOnFailureListener {
    val statusCode = (it as ApiException).statusCode

    if (statusCode == LocationSettingsStatusCodes.RESOLUTION_REQUIRED) {
      val resolvableException = it as? ResolvableApiException
      resolvableException?.startResolutionForResult(this@MainActivity, REQUEST_CHECK_SETTINGS)
    }
  }
}

}

//1 fun enableLocation() { if (PermissionsManager.areLocationPermissionsGranted(this)) { initializeLocationComponent() initializeLocationEngine() //map.addOnMapClickListener(this) } else { permissionManager = PermissionsManager(this) permissionManager.requestLocationPermissions(this) } }

//2 @SuppressWarnings("MissingPermission") fun initializeLocationEngine() { locationEngine = LocationEngineProvider(this).obtainBestLocationEngineAvailable() locationEngine?.priority = LocationEnginePriority.HIGH_ACCURACY locationEngine?.activate() locationEngine?.addLocationEngineListener(this)

val lastLocation = locationEngine?.lastLocation
if (lastLocation != null) {
  originLocation = lastLocation
  setCameraPosition(lastLocation)
} else {
  locationEngine?.addLocationEngineListener(this)
}

}

@SuppressWarnings("MissingPermission") fun initializeLocationComponent() { locationComponent = map.locationComponent locationComponent?.activateLocationComponent(this)

locationComponent?.isLocationComponentEnabled = true
locationComponent?.cameraMode = CameraMode.TRACKING_COMPASS

}

//3 fun setCameraPosition(location: Location) { map.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location.latitude, location.longitude), 13.0)) }

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults)

permissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)

}

/*override fun onMapClick(point: LatLng) { if (!map.markers.isEmpty()) { map.clear() }

map.addMarker(MarkerOptions().setTitle("I'm a marker :]").setSnippet("This is a snippet about this marker that will show up here").position(point))

checkLocation()
originLocation?.run {
  val startPoint = Point.fromLngLat(longitude, latitude)
  val endPoint = Point.fromLngLat(point.longitude, point.latitude)

  getRoute(startPoint, endPoint)
}

} */ @SuppressLint("MissingPermission") private fun checkLocation() { if (originLocation == null) { map.locationComponent.lastKnownLocation?.run { originLocation = this } } }

private fun getRoute(originPoint: Point, endPoint: Point) { NavigationRoute.builder(this) //1 .accessToken(Mapbox.getAccessToken()!!) //2 .origin(originPoint) //3 .destination(endPoint) //4 .build() //5 .getRoute(object : Callback { //6 override fun onFailure(call: Call, t: Throwable) { Log.d("MainActivity", t.localizedMessage) }

      override fun onResponse(call: Call<DirectionsResponse>,
                              response: Response<DirectionsResponse>) {
        if (navigationMapRoute != null) {
          navigationMapRoute?.updateRouteVisibilityTo(false)
        } else {
          navigationMapRoute = NavigationMapRoute(null, mapbox, map)
        }

        currentRoute = response.body()?.routes()?.first()
        if (currentRoute != null) {
          navigationMapRoute?.addRoute(currentRoute)
        }

        btnNavigate.isEnabled = true
      }
    })

} }

`