¿Cómo obtengo una paleta para mi mapa de bits una vez que Picasso Loads?

En octubre de 2014, Jake Wharton escribió Coercing Picasso to Play With Palette . En él, hay dos métodos que se ponderan:

  1. Uso de una transformación que genera la paleta. La ventaja de esto es que la paleta se genera en el hilo de trabajo de Picasso y está lista cuando se carga la imagen. La desventaja, sin embargo, parece ser que estoy recibiendo paletas que no coinciden con la imagen. En este momento sólo ejecuto una de estas transformaciones a la vez.

  2. Uso de una Callback que onSuccess obtiene el mapa de bits de ImageView y genera la paleta. No puedo evitar enfocarme en el // Ew! que Jake pone al final de esta línea y estoy totalmente de acuerdo con ella.

El post mencionado anteriormente fue escrito en octubre de 2014. Ahora que estamos meses de la discusión, me pregunto cuál es el método recomendado? También hubo una discusión sobre la asociación de meta data con mapas de bits. ¿Está implementado? ¿Cómo lo usaría?

Mi código de Transformation (no final, acabo de empezar a buscar en esto):

 public final class PaletteGenerator implements Transformation { private final int numColors; @Getter private Palette palette; @Override public Bitmap transform (final Bitmap source) { palette = null; final Palette palette = numColors > 0 ? Palette.generate (source, numColors) : Palette.generate (source); return source; } @Override public String key () { return String.format (Locale.ENGLISH, "%s:%d", getClass ().getCanonicalName (), numColors); } public PaletteGenerator () { this (0); } public PaletteGenerator (final int c) { numColors = c; } } 

De acuerdo con Jake Wharton no hay buen camino todavía

Lo que acabé haciendo fue que fui con el método de Transformación, con el código feo encapsulado y escondido en el ático.

 public final class PaletteGeneratorTransformation implements Transformation { private static final Map<Bitmap, Palette> CACHE = new WeakHashMap<> (); private final int numColors; @Override public Bitmap transform (final Bitmap source) { if (!CACHE.containsKey (source)) { final Palette palette = numColors > 0 ? Palette.generate (source, numColors) : Palette.generate (source); CACHE.put (source, palette); } return source; } @Override public String key () { return getClass ().getCanonicalName () + ":" + numColors; } public PaletteGeneratorTransformation () { this (0); } public PaletteGeneratorTransformation (final int c) { numColors = c; } public static abstract class Callback implements com.squareup.picasso.Callback { private final ImageView target; public Callback (final ImageView t) { target = t; } @Override public void onSuccess () { onPalette (CACHE.get (((BitmapDrawable) target.getDrawable ()).getBitmap ())); } @Override public void onError () { onPalette (null); } public abstract void onPalette (final Palette palette); } } 

En mi Actividad, hago algo en este sentido:

 Picasso.with(context) .load (getPhotoUri()) .transform (new PaletteGeneratorTransformation (DEFAULT_NUM_COLORS)) .into (photo, new PaletteGeneratorTransformation.Callback (photo) { @Override public void onPalette (final Palette palette) { themeWithPalette (palette); } }); 

El único problema que queda es que sé que hay fealdad escondida en el ático y por ahora que tiene que seguir siendo mi pequeño secreto sucio.

 Target target = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { viewHolder.mItemImage.setImageBitmap(bitmap); Drawable image = viewHolder.mItemImage.getDrawable(); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } @Override public void onBitmapFailed(Drawable errorDrawable) { } }; Picasso.with(viewHolder.mItemImage.getContext()).load("url").into(viewHolder.mItemImage); 
  • Android: crear imagen circular con picasso
  • Android - picasso muestra solo marcador de posición, no la imagen de URL
  • Uso de Picasso para cargar una imagen en un mapa de bits
  • Cómo obtener un contexto en un adaptador de vista de reciclador
  • Actualizar / cambiar el mapa de bits en caché utilizando Picasso y OkHttp
  • Imágenes que no se cargan con Picasso sin error
  • Obtener imagen uri de picasso?
  • Carga imágenes grandes con Picasso y objeto Transform personalizado
  • Aplicación de Android se bloquea para algunos usuarios al aplicar la transformación con Picasso
  • Clear Disk / SD Card Cache de la Biblioteca de imágenes de Picasso de Android
  • Android Picasso - Cómo obtener estadísticas sobre accesos y descargas de caché
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.