varios studio remove markeroptions marcadores icon google custom change agregar android google-maps vector-graphics

android - studio - VectorDrawable con GoogleMap BitmapDescriptor



markeroptions google maps android (4)

Tengo un problema con los mapas de Google BitmapDescriptor al crear un icono para MarkerOptions usando VectorDrawable , API 5.0+

Método utilizado para la creación:

@NonNull private BitmapDescriptor getBitmapDescriptor(int id) { return BitmapDescriptorFactory.fromResource(id); }

Todo funciona muy bien cuando id argument contiene png drawable, sin embargo, si lo intento con VectorDrawable definido en xml, la aplicación 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.a.a.ae.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, intenté crear bitmap usando BitmapFactory.fromResources y más tarde BitmapDescritpionFactory.fromBitmap pero los resultados son los mismos. Simplemente no funcionará con vector dibujable. Probé diferentes vectores también, pero parece que la complejidad del vector no es el problema aquí.

¿Alguien sabe cómo solucionar este bloqueo?

@editar

Parece que el problema no estaba en BitmapDescriptior sí, sino en cargar VectorDrawable que devolvía un mapa de bits incorrecto. Sin embargo, la solución propuesta en respuesta todavía está bien.


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 code.google.com/p/gmaps-api-issues/issues/detail?id=9011 ( publicado por vaughandroid - gracias!) Utilizando un VectorDrawable no será compatible por el momento. Vea el comentario en el informe de error para 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); }

usado 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"));

Teñir el vector es una bonificación


Posible solución:

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); }


VectorDrawable to 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