¿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:
-
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.
- Mostrar una imagen "Cargando ..." mientras carga el fondo de la imagen con Picasso
- Utilice Picasso para colocar la imagen en dibujable
- Cómo cargar un mapa de bits con Picasso sin usar un ImageView?
- Cómo borrar el caché de una URL específica de caché de Picasso
- Picasso - obtener el camino de la imagen cargada
-
Uso de una
Callback
queonSuccess
obtiene el mapa de bits deImageView
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; } }
- Visualización de una imagen descargada de Internet como anotación - Uso de Picasso
- Picasso Imagen descargada de nuevo para un ImageView con diferentes dimensiones?
- Picasso image loading library: cómo cargar miniaturas de video
- Cómo descargar y almacenar en caché el mapa de bits utilizando la biblioteca de Picasso
- HorizontalGridView / RecyclerLa posición de desplazamiento se restablece una vez que la imagen de Picasso se carga
- Uso de la biblioteca picasso con una vista de imagen circular
- La biblioteca de Picasso no carga imágenes de la tarjeta SD en Android
- Elementos compartidos de Android con Picasso
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);
- mostrar emoticonos con Spannable en una vista de texto
- Android Descargar Manager Issue en Samsung Tab GT-P3100