VectorDrawable con GoogleMap BitmapDescriptor
Tengo problema con google maps BitmapDescriptor
al crear el icono para MarkerOptions
usando VectorDrawable
, API 5.0+
Método utilizado para la creación:
- Gráficos vectoriales en Android
- Errores de importación de elementos de Android Studio Vector: Etiquetas no compatibles
- Vector Asset Studio está importando archivo .svg colorido en blanco y negro
- Los activos de vector de masas importan Android Studio
- Cambiar el color de relleno del elemento vectorial en Android Studio
@NonNull private BitmapDescriptor getBitmapDescriptor(int id) { return BitmapDescriptorFactory.fromResource(id); }
Todo funciona muy bien cuando el argumento id
contiene png drawable, sin embargo si lo intento con VectorDrawable
definido en xml, App siempre se googleMap.addMarker(marker)
cuando googleMap.addMarker(marker)
( BitmapDescriptor
no es nulo).
11-05 10:15:05.213 14536-14536/xxx.xxxxx.app E/AndroidRuntime: FATAL EXCEPTION: main Process: xxx.xxxxx.app, PID: 14536 java.lang.NullPointerException at com.google.aaae.a(Unknown Source) at com.google.maps.api.android.lib6.d.dn.<init>(Unknown Source) at com.google.maps.api.android.lib6.d.dm.a(Unknown Source) at com.google.maps.api.android.lib6.d.ag.<init>(Unknown Source) at com.google.maps.api.android.lib6.d.eu.a(Unknown Source) at com.google.android.gms.maps.internal.j.onTransact(SourceFile:167) at android.os.Binder.transact(Binder.java:380) at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source) at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source) at xxx.xxxxx.app.ui.details.DetailActivity.lambda$initGoogleMaps$23(DetailActivity.java:387) at xxx.xxxxx.app.ui.details.DetailActivity.access$lambda$10(DetailActivity.java) at xxx.xxxxx.app.ui.details.DetailActivity$$Lambda$13.onMapReady(Unknown Source) at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source) at com.google.android.gms.maps.internal.zzl$zza.onTransact(Unknown Source) at android.os.Binder.transact(Binder.java:380) at com.google.android.gms.maps.internal.av.a(SourceFile:82) at com.google.maps.api.android.lib6.d.fa.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
No importa cómo recupero drawable, intentado crear el mapa de bits usando BitmapFactory.fromResources
y más adelante BitmapDescritpionFactory.fromBitmap
pero los resultados son iguales. Simplemente no funcionará con el vector dibujable. Probado diferentes vectores también, pero parece que vector complejidad no es el problema aquí.
¿Alguien sabe cómo solucionar este accidente?
@editar
Parece que el problema no era con el propio BitmapDescriptior
, sino con la carga de VectorDrawable
que estaba devolviendo bitmap incorrecto. Sin embargo, la solución propuesta en respuesta sigue siendo buena.
- El selector de color para la imagen vectorial no funciona
- Cómo cambiar el color de la trayectoria del vector drenable en el botón de clic
- Visualización de archivos SVG en Android
- ¿Se puede rotar la capa de clip-path de Android drawable?
- ¿Cómo podemos azulejar una imagen vectorial?
- GeneradasDensidades Desaprobadas
- Renderización SVG con OpenGL (y OpenGL ES)
- Uso de iconos vectoriales en Android
Solución posible:
private BitmapDescriptor getBitmapDescriptor(int id) { Drawable vectorDrawable = context.getDrawable(id); int h = ((int) Utils.convertDpToPixel(42, context)); int w = ((int) Utils.convertDpToPixel(25, context)); vectorDrawable.setBounds(0, 0, w, h); Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bm); vectorDrawable.draw(canvas); return BitmapDescriptorFactory.fromBitmap(bm); }
Aquí hay otra referencia: http://qiita.com/konifar/items/aaff934edbf44e39b04a
public class ResourceUtil { @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static Bitmap getBitmap(VectorDrawable vectorDrawable) { Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); vectorDrawable.draw(canvas); return bitmap; } private static Bitmap getBitmap(VectorDrawableCompat vectorDrawable) { Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); vectorDrawable.draw(canvas); return bitmap; } public static Bitmap getBitmap(Context context, @DrawableRes int drawableResId) { Drawable drawable = ContextCompat.getDrawable(context, drawableResId); if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } else if (drawable instanceof VectorDrawableCompat) { return getBitmap((VectorDrawableCompat) drawable); } else if (drawable instanceof VectorDrawable) { return getBitmap((VectorDrawable) drawable); } else { throw new IllegalArgumentException("Unsupported drawable type"); } } }
De acuerdo con el informe de errores ( publicado por vaughandroid – gracias!) El uso de un VectorDrawable no será compatible por el momento. Consulte el comentario en el informe de errores para obtener más información.
Esta es la solución sugerida por el equipo de Google Maps:
/** * Demonstrates converting a {@link Drawable} to a {@link BitmapDescriptor}, * for use as a marker icon. */ private BitmapDescriptor vectorToBitmap(@DrawableRes int id, @ColorInt int color) { Drawable vectorDrawable = ResourcesCompat.getDrawable(getResources(), id, null); Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); DrawableCompat.setTint(vectorDrawable, color); vectorDrawable.draw(canvas); return BitmapDescriptorFactory.fromBitmap(bitmap); }
Utilizado de esta manera:
// Vector drawable resource as a marker icon. mMap.addMarker(new MarkerOptions() .position(ALICE_SPRINGS) .icon(vectorToBitmap(R.drawable.ic_android, Color.parseColor("#A4C639"))) .title("Alice Springs"));
El tintado del vector es un bono
VectorDrawable
a BitmapDescriptor
sin tinte
private BitmapDescriptor getBitmapDescriptor(@DrawableRes int id) { Drawable vectorDrawable = ResourcesCompat.getDrawable(getResources(), id, null); Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); vectorDrawable.draw(canvas); return BitmapDescriptorFactory.fromBitmap(bitmap); }
Gracias @lbarbosa
- Excepción de host desconocido de Java
- ¿Comparte URL a Facebook, Twitter y correo electrónico en Android?