Android
Deslizamiento
Buscar..
Introducción
**** ADVERTENCIA Esta documentación no se mantiene y con frecuencia es inexacta ****
La documentación oficial de Glide es una fuente mucho mejor:
Para Glide v4, consulte http://bumptech.github.io/glide/ . Para Glide v3, consulte https://github.com/bumptech/glide/wiki .
Observaciones
Glide es un marco de administración de medios y carga de imágenes de código abierto rápido y eficiente para Android que envuelve la decodificación de medios, la memoria y el almacenamiento en caché de discos, y la agrupación de recursos en una interfaz simple y fácil de usar.
Glide admite la captura, decodificación y visualización de imágenes fijas de video, imágenes y GIF animados. Glide incluye una API flexible que permite a los desarrolladores conectarse a casi cualquier pila de red.
De manera predeterminada, Glide usa una pila personalizada basada en HttpUrlConnection , pero también incluye bibliotecas de utilidades conectadas al proyecto Volley de Google o a la biblioteca OkHttp de Square .
El objetivo principal de Glide es hacer que el desplazamiento de cualquier tipo de lista de imágenes sea lo más suave y rápido posible, pero Glide también es efectivo para casi cualquier caso en el que necesite buscar, cambiar el tamaño y mostrar una imagen remota.
El código fuente y la documentación adicional están disponibles en GitHub: https://github.com/bumptech/glide
Agrega Glide a tu proyecto
De la documentación oficial :
Con Gradle:
repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}
dependencies {
compile 'com.github.bumptech.glide:glide:4.0.0'
compile 'com.android.support:support-v4:25.3.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'
}
Con Maven:
<dependency>
<groupId>com.github.bumptech.glide</groupId>
<artifactId>glide</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>support-v4</artifactId>
<version>r7</version>
</dependency>
<dependency>
<groupId>com.github.bumptech.glide</groupId>
<artifactId>compiler</artifactId>
<version>4.0.0</version>
<optional>true</optional>
</dependency>
Dependiendo de su configuración y uso de ProGuard (DexGuard), es posible que también deba incluir las siguientes líneas en su proguard.cfg (consulte la wiki de Glide para obtener más información):
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
Cargando una imagen
ImageView
Para cargar una imagen desde una URL específica, Uri, ID de recurso o cualquier otro modelo en un ImageView
:
ImageView imageView = (ImageView) findViewById(R.id.imageView);
String yourUrl = "http://www.yoururl.com/image.png";
Glide.with(context)
.load(yourUrl)
.into(imageView);
Para Uris, reemplace yourUrl
con su Uri ( content://media/external/images/1
). Para Drawables, reemplace yourUrl
con su ID de recurso ( R.drawable.image
).
RecyclerView y ListView
En ListView o RecyclerView, puede usar exactamente las mismas líneas:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
String currentUrl = myUrls.get(position);
Glide.with(context)
.load(currentUrl)
.into(myViewHolder.imageView);
}
Si no desea iniciar una carga en onBindViewHolder
, asegúrese de clear()
cualquier ImageView
Glide que esté administrando antes de modificar ImageView
:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
String currentUrl = myUrls.get(position);
if (TextUtils.isEmpty(currentUrl)) {
Glide.clear(viewHolder.imageView);
// Now that the view has been cleared, you can safely set your own resource
viewHolder.imageView.setImageResource(R.drawable.missing_image);
} else {
Glide.with(context)
.load(currentUrl)
.into(myViewHolder.imageView);
}
}
Transformación del círculo deslizante (Cargar imagen en una vista de imagen circular)
Crea una imagen de círculo con deslizamiento.
public class CircleTransform extends BitmapTransformation {
public CircleTransform(Context context) {
super(context);
}
@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override public String getId() {
return getClass().getName();
}
}
Uso:
Glide.with(context)
.load(yourimageurl)
.transform(new CircleTransform(context))
.into(userImageView);
Transformaciones por defecto
Glide incluye dos transformaciones predeterminadas, ajuste centro y centro de recorte.
Centro de ajuste:
Glide.with(context)
.load(yourUrl)
.fitCenter()
.into(yourView);
El centro de ajuste realiza la misma transformación que ScaleType.FIT_CENTER de Android.
Cultivo central:
Glide.with(context)
.load(yourUrl)
.centerCrop()
.into(yourView);
El recorte central realiza la misma transformación que el ScaleType.CENTER_CROP de Android.
Para más información, vea la wiki de Glide .
Imagen de esquinas redondeadas con objetivo Glide personalizado
Primero haga la clase de utilidad o use este método en la clase necesaria
public class UIUtils {
public static BitmapImageViewTarget getRoundedImageTarget(@NonNull final Context context, @NonNull final ImageView imageView,
final float radius) {
return new BitmapImageViewTarget(imageView) {
@Override
protected void setResource(final Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCornerRadius(radius);
imageView.setImageDrawable(circularBitmapDrawable);
}
};
}
Cargando imagen:
Glide.with(context)
.load(imageUrl)
.asBitmap()
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Aunque usas asBitmap () las animaciones se eliminarán. Puedes usar tu propia animación en este lugar usando el método animate ().
Ejemplo con fundido similar a la animación predeterminada de deslizamiento.
Glide.with(context)
.load(imageUrl)
.asBitmap()
.animate(R.anim.abc_fade_in)
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Tenga en cuenta que esta animación es un recurso privado de la biblioteca de soporte; no se recomienda su uso, ya que puede cambiarse o incluso eliminarse.
Tenga en cuenta que también necesita tener una biblioteca de soporte para usar RoundedBitmapDrawableFactory
Precarga de imagenes
Para precargar imágenes remotas y asegurarse de que la imagen solo se descarga una vez:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
Entonces:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) // ALL works here too
.into(imageView);
Para precargar imágenes locales y asegurarse de que haya una copia transformada en la memoria caché del disco (y quizás en la memoria caché):
Glide.with(context)
.load(yourFilePathOrUri)
.fitCenter() // Or whatever transformation you want
.preload(200, 200); // Or whatever width and height you want
Entonces:
Glide.with(context)
.load(yourFilePathOrUri)
.fitCenter() // You must use the same transformation as above
.override(200, 200) // You must use the same width and height as above
.into(imageView);
Marcador de posición y manejo de errores
Si desea agregar un Drawable que se muestra durante la carga, puede agregar un marcador de posición:
Glide.with(context)
.load(yourUrl)
.placeholder(R.drawable.placeholder)
.into(imageView);
Si desea que se muestre un Drawable si la carga falla por algún motivo:
Glide.with(context)
.load(yourUrl)
.error(R.drawable.error)
.into(imageView);
Si desea que se muestre un Drawable si proporciona un modelo nulo (URL, Uri, ruta de archivo, etc.):
Glide.with(context)
.load(maybeNullUrl)
.fallback(R.drawable.fallback)
.into(imageView);
Cargar imagen en un ImageView circular sin transformaciones personalizadas.
Cree un BitmapImageViewTarget personalizado para cargar la imagen en:
public class CircularBitmapImageViewTarget extends BitmapImageViewTarget
{
private Context context;
private ImageView imageView;
public CircularBitmapImageViewTarget(Context context, ImageView imageView)
{
super(imageView);
this.context = context;
this.imageView = imageView;
}
@Override
protected void setResource(Bitmap resource)
{
RoundedBitmapDrawable bitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), resource);
bitmapDrawable.setCircular(true);
imageView.setImageDrawable(bitmapDrawable);
}
}
Uso:
Glide
.with(context)
.load(yourimageidentifier)
.asBitmap()
.into(new CircularBitmapImageViewTarget(context, imageView));
Falló la carga de la imagen de Glide
Glide
.with(context)
.load(currentUrl)
.into(new BitmapImageViewTarget(profilePicture) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCornerRadius(radius);
imageView.setImageDrawable(circularBitmapDrawable);
}
@Override
public void onLoadFailed(@NonNull Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, SET_YOUR_DEFAULT_IMAGE);
Log.e(TAG, e.getMessage(), e);
}
});
Aquí, en SET_YOUR_DEFAULT_IMAGE
, puede establecer cualquier Drawable
predeterminado. Esta imagen se mostrará si falla la carga de la imagen.