Uso de Picasso con Image Getter
Estoy construyendo una aplicación de chat y estoy tratando de añadir una imagen a un EditText, mediante el uso de Picasso para obtener la imagen de una URL y la append y ImageGetter para adjuntar la imagen a la EditText. Sin embargo, lo que he implementado a continuación no funciona, ya que agregar mensajes al usar la aplicación muestra nada (pero el mensaje aparece en la base de datos).
He probado sin utilizar Picasso, simplemente utilizando el ImageGetter con un recurso de imagen dentro de la aplicación funciona bien, sólo que no es de una URL como es necesario.
- Picasso no carga imagen de caché en listview
- Cómo descargar y almacenar en caché el mapa de bits utilizando la biblioteca de Picasso
- Android - picasso muestra solo marcador de posición, no la imagen de URL
- Picasso ejecutar primero no llamar onBitmapLoaded in for loop
- Rotar correctamente las imágenes web utilizando Picasso de Square
¿Cuál es la forma correcta de configurar ImageGetter y / o el método append para que esta funcionalidad funcione con Picasso? ¿O hay una manera más simple?
Método Append:
public void appendToMessageHistory(final String username, final String message) { if (username != null && message != null) { Picasso.with(getBaseContext()) .load("http://localhost:3000/uploads/campaign/image/2/2.jpg") .into(new Target() { @Override public void onPrepareLoad(Drawable arg0) { } @Override public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) { Drawable drawImage = new BitmapDrawable( getBaseContext().getResources(), bitmap); drawImage.setBounds(0, 0, drawImage.getIntrinsicHeight(), drawImage.getIntrinsicWidth()); messageHistoryText.append(Html.fromHtml("<b>" + username + ":" + "</b>" + "<br>")); messageHistoryText.append(Html.fromHtml(message + "<hr>" + "<br>") + System.getProperty("line.separator") + ""); messageHistoryText.append(Html .fromHtml("<img src = '" + drawImage + "'/>", imageGetter, null)); } @Override public void onBitmapFailed(Drawable arg0) { } }); } }
ImageGetter:
ImageGetter imageGetter = new ImageGetter() { Drawable imageUsed=null; @Override public Drawable getDrawable(String source) { Picasso.with(getBaseContext()) .load("http://localhost:3000/uploads/campaign/image/2/2.jpg") .into(new Target() { @Override public void onPrepareLoad(Drawable arg0) { } @Override public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) { Drawable drawImage = new BitmapDrawable( getBaseContext().getResources(), bitmap); drawImage.setBounds(0, 0, drawImage.getIntrinsicHeight(), drawImage.getIntrinsicWidth()); imageUsed=drawImage; } @Override public void onBitmapFailed(Drawable arg0) { } }); return imageUsed; } };
- ViewPager + Picasso
- Problemas con la recolección de basura y Picasso
- ¿Cómo informar a Picasso de que la imagen del enlace ha cambiado?
- Picasso image loading library: cómo cargar miniaturas de video
- Picasso carga imágenes con una imagen errónea en un adaptador de lista
- Utilice Picasso para colocar la imagen en dibujable
- Cómo obtener ImageView negro utilizando Picasso y Glide
- Picasso carga de imagen de devolución de llamada
No pude conseguir que funcionara con el objetivo de Picasso …
Mi solución es:
- Utilizar un AsyncTask para la simultaneidad
- Use el método get () de Picasso para cargar la imagen de forma síncrona en el método de fondo de AsyncTask
Me gusta esto:
public class PicassoImageGetter implements Html.ImageGetter { final Resources resources; final Picasso pablo; final TextView textView; public PicassoImageGetter(final TextView textView, final Resources resources, final Picasso pablo) { this.textView = textView; this.resources = resources; this.pablo = pablo; } @Override public Drawable getDrawable(final String source) { final BitmapDrawablePlaceHolder result = new BitmapDrawablePlaceHolder(); new AsyncTask<Void, Void, Bitmap>() { @Override protected Bitmap doInBackground(final Void... meh) { try { return pablo.load(source).get(); } catch (Exception e) { return null; } } @Override protected void onPostExecute(final Bitmap bitmap) { try { final BitmapDrawable drawable = new BitmapDrawable(resources, bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); result.setDrawable(drawable); result.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); textView.setText(textView.getText()); // invalidate() doesn't work correctly... } catch (Exception e) { /* nom nom nom*/ } } }.execute((Void) null); return result; } static class BitmapDrawablePlaceHolder extends BitmapDrawable { protected Drawable drawable; @Override public void draw(final Canvas canvas) { if (drawable != null) { drawable.draw(canvas); } } public void setDrawable(Drawable drawable) { this.drawable = drawable; } }
Espero que esto sea útil.
Construí sobre la respuesta de Thomas. Utilicé los métodos existentes de Picasso para descargar cualquier imagen en un diverso hilo y explicado para el marcador de posición Drawables también.
public class PicassoImageGetter implements Html.ImageGetter { private TextView textView = null; public PicassoImageGetter() {} public PicassoImageGetter(TextView target) { textView = target; } @Override public Drawable getDrawable(String source) { BitmapDrawablePlaceHolder drawable = new BitmapDrawablePlaceHolder(); Context context = FeedSurferApp.getContext(); FeedSurferApp .getPicasso() .load(source) .error(ResourcesCompat.getDrawable(context.getResources(), R.drawable.connection_error, context.getTheme())) .into(drawable); return drawable; } private class BitmapDrawablePlaceHolder extends BitmapDrawable implements Target { protected Drawable drawable; @Override public void draw(final Canvas canvas) { if (drawable != null) { drawable.draw(canvas); } } public void setDrawable(Drawable drawable) { this.drawable = drawable; drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); if (textView != null) { textView.setText(textView.getText()); } } @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { setDrawable(new BitmapDrawable(FeedSurferApp.getContext().getResources(), bitmap)); } @Override public void onBitmapFailed(Drawable errorDrawable) { setDrawable(errorDrawable); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} } }
He encontrado una manera de utilizar ImageGetter con Picasso Target:
public Drawable getDrawable(String source) { final BitmapDrawablePlaceHolder result = new BitmapDrawablePlaceHolder(); Picasso.with(getContext()).load(source).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { final BitmapDrawable drawable = new BitmapDrawable(mContext.getResources(), bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); result.setDrawable(drawable); result.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); content.setText(content.getText()); // cache is now warmed up } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); return result;
}
Esto utiliza el caché y ya no es una llamada síncrona que requiere el AsyncTask.
Crédito para: ¿ Buscar imágenes con Callback en Picasso?
- Cómo obtener la información de latitud y longitud de la imagen
- No puede instanciar la aplicación – ClassNotFoundException