Android
planata
Ricerca…
introduzione
**** AVVERTENZA Questa documentazione non è mantenuta e spesso non accurata ****
La documentazione ufficiale di Glide è una fonte molto migliore:
Per Glide v4, vedi http://bumptech.github.io/glide/ . Per Glide v3, vedere https://github.com/bumptech/glide/wiki .
Osservazioni
Glide è una veloce ed efficiente gestione dei media open source e framework di caricamento delle immagini per Android che avvolge la decodifica dei media, la memoria e la cache del disco e il pooling delle risorse in un'interfaccia semplice e facile da usare.
Glide supporta il recupero, la decodifica e la visualizzazione di fermi immagine, immagini e GIF animate. Glide include un'API flessibile che consente agli sviluppatori di collegarsi a quasi tutti gli stack di rete.
Per impostazione predefinita, Glide utilizza uno stack basato su HttpUrlConnection personalizzato, ma include anche librerie di utilità plug-in nel progetto Volley di Google o nella libreria OkHttp di Square .
L'obiettivo principale di Glide è quello di far scorrere qualsiasi tipo di elenco di immagini il più agevole e veloce possibile, ma Glide è efficace anche in quasi tutti i casi in cui è necessario recuperare, ridimensionare e visualizzare un'immagine remota.
Codice sorgente e ulteriore documentazione sono disponibili su GitHub: https://github.com/bumptech/glide
Aggiungi Glide al tuo progetto
Dalla documentazione ufficiale :
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>
A seconda della configurazione e dell'utilizzo di ProGuard (DexGuard), potrebbe essere necessario includere le seguenti righe nel proguard.cfg (per ulteriori informazioni, vedere la wiki di Glide ):
-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
Caricamento di un'immagine
ImageView
Per caricare un'immagine da un URL, Uri, ID risorsa o qualsiasi altro modello in un ImageView
:
ImageView imageView = (ImageView) findViewById(R.id.imageView);
String yourUrl = "http://www.yoururl.com/image.png";
Glide.with(context)
.load(yourUrl)
.into(imageView);
Per Uris, sostituire yourUrl
con il tuo Uri ( content://media/external/images/1
). Per i Drawable, sostituire yourUrl
con il proprio ID risorsa ( R.drawable.image
).
RecyclerView e ListView
In ListView o RecyclerView, puoi utilizzare esattamente le stesse linee:
@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);
}
Se non si desidera avviare un caricamento in onBindViewHolder
, assicurarsi di clear()
qualsiasi ImageView
Glide possa essere gestito prima di modificare 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);
}
}
Trasformazione del cerchio di slittamento (carica l'immagine in un ImageView circolare)
Crea un'immagine circolare con la planata.
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);
Trasformazioni predefinite
Glide include due trasformazioni predefinite, adatte al centro e al centro del ritaglio.
Fit center:
Glide.with(context)
.load(yourUrl)
.fitCenter()
.into(yourView);
Il centro Fit esegue la stessa trasformazione di ScaleType.FIT_CENTER di Android.
Coltura centrale:
Glide.with(context)
.load(yourUrl)
.centerCrop()
.into(yourView);
Il ritaglio centrale esegue la stessa trasformazione di ScaleType.CENTER_CROP di Android.
Per ulteriori informazioni, vedere la wiki di Glide .
Scorri le immagini degli angoli arrotondati con il bersaglio Glide personalizzato
Per prima cosa rendi una classe di utilità o usa questo metodo nella classe necessaria
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);
}
};
}
Caricamento immagine:
Glide.with(context)
.load(imageUrl)
.asBitmap()
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Poiché si utilizza asBitmap (), tuttavia, le animazioni verranno rimosse. Puoi usare la tua animazione in questo posto usando il metodo animate ().
Esempio con dissolvenza simile all'animazione Glide predefinita.
Glide.with(context)
.load(imageUrl)
.asBitmap()
.animate(R.anim.abc_fade_in)
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Si prega di notare che questa animazione è una risorsa privata della libreria di supporto - non è raccomandabile da utilizzare in quanto può cambiare o addirittura essere rimossa.
Si noti inoltre che è necessario disporre della libreria di supporto per utilizzare RoundedBitmapDrawableFactory
Precaricamento delle immagini
Per precaricare le immagini remote e assicurarsi che l'immagine venga scaricata solo una volta:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
Poi:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) // ALL works here too
.into(imageView);
Per precaricare le immagini locali e accertarsi che una copia trasformata si trovi nella cache del disco (e magari nella cache della memoria):
Glide.with(context)
.load(yourFilePathOrUri)
.fitCenter() // Or whatever transformation you want
.preload(200, 200); // Or whatever width and height you want
Poi:
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);
Segnaposto e gestione degli errori
Se vuoi aggiungere un Drawable da mostrare durante il caricamento, puoi aggiungere un segnaposto:
Glide.with(context)
.load(yourUrl)
.placeholder(R.drawable.placeholder)
.into(imageView);
Se vuoi che venga mostrato un Drawable se il caricamento fallisce per qualsiasi motivo:
Glide.with(context)
.load(yourUrl)
.error(R.drawable.error)
.into(imageView);
Se vuoi che venga mostrato un Drawable se fornisci un modello null (URL, Uri, percorso file, ecc.):
Glide.with(context)
.load(maybeNullUrl)
.fallback(R.drawable.fallback)
.into(imageView);
Carica l'immagine in un ImageView circolare senza trasformazioni personalizzate
Crea un BitmapImageViewTarget personalizzato per caricare l'immagine in:
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));
Gestione del caricamento dell'immagine Glide non riuscita
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);
}
});
Qui al SET_YOUR_DEFAULT_IMAGE
posto puoi impostare qualsiasi Drawable
predefinito. Questa immagine verrà mostrata se il caricamento dell'immagine non è riuscito.