Android
Poślizg
Szukaj…
Wprowadzenie
**** OSTRZEŻENIE Niniejsza dokumentacja jest nieutrzymywana i często niedokładna ****
Oficjalna dokumentacja Glide'a jest znacznie lepszym źródłem:
W przypadku Glide v4 zobacz http://bumptech.github.io/glide/ . W przypadku Glide v3 zobacz https://github.com/bumptech/glide/wiki .
Uwagi
Glide to szybkie i wydajne narzędzie do zarządzania multimediami i ładowania obrazów typu open source dla systemu Android, które otacza dekodowanie multimediów, pamięć podręczną i pamięć podręczną dysków oraz pule zasobów w prosty i łatwy w użyciu interfejs.
Glide obsługuje pobieranie, dekodowanie i wyświetlanie zdjęć, obrazów i animowanych plików GIF. Glide zawiera elastyczny interfejs API, który umożliwia programistom podłączanie się do niemal każdego stosu sieciowego.
Domyślnie Glide używa niestandardowego stosu opartego na HttpUrlConnection , ale zawiera także biblioteki narzędziowe podłączone do projektu Volley firmy Google lub biblioteki OkHttp Square .
Głównym celem Glide jest sprawienie, aby przewijanie dowolnej listy obrazów było tak płynne i szybkie, jak to możliwe, ale Glide działa również w prawie każdym przypadku, gdy trzeba pobrać, zmienić rozmiar i wyświetlić zdalny obraz.
Kod źródłowy i dalsza dokumentacja są dostępne na GitHub: https://github.com/bumptech/glide
Dodaj Glide do swojego projektu
Z 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'
}
Z 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>
W zależności od konfiguracji ProGuard (DexGuard) i sposobu użytkowania może być konieczne dołączenie następujących linii do proguard.cfg (więcej informacji na stronie Glide w wiki ):
-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
Ładowanie obrazu
ImageView
Aby załadować obraz z określonego adresu URL, identyfikatora Uri, identyfikatora zasobu lub dowolnego innego modelu do ImageView
:
ImageView imageView = (ImageView) findViewById(R.id.imageView);
String yourUrl = "http://www.yoururl.com/image.png";
Glide.with(context)
.load(yourUrl)
.into(imageView);
W przypadku Uris zamień yourUrl
na Uri ( content://media/external/images/1
). W przypadku Drawables zamień yourUrl
na identyfikator zasobu ( R.drawable.image
).
RecyclerView i ListView
W ListView lub RecyclerView możesz użyć dokładnie tych samych wierszy:
@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);
}
Jeśli nie chcesz uruchamiać ładowania w onBindViewHolder
, upewnij się, że clear()
dowolny ImageView
Glide, którym może zarządzać przed modyfikacją 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);
}
}
Transformacja koła poślizgowego (Załaduj obraz w okrągłym ImageView)
Utwórz obraz koła z poślizgiem.
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();
}
}
Stosowanie:
Glide.with(context)
.load(yourimageurl)
.transform(new CircleTransform(context))
.into(userImageView);
Domyślne transformacje
Szybkość obejmuje dwie domyślne transformacje: dopasuj środkowy i środkowy kadr.
Centrum dopasowania:
Glide.with(context)
.load(yourUrl)
.fitCenter()
.into(yourView);
Centrum dopasowania wykonuje tę samą transformację, co ScaleType.FIT_CENTER Androida.
Centralne przycięcie:
Glide.with(context)
.load(yourUrl)
.centerCrop()
.into(yourView);
Kadrowanie środkowe wykonuje tę samą transformację, co ScaleType.CENTER_CROP Androida.
Aby uzyskać więcej informacji, zobacz wiki Glide .
Przesuwaj obraz zaokrąglonych rogów z niestandardowym celem Glide
Najpierw utwórz klasę użyteczności lub użyj tej metody w potrzebnej klasie
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);
}
};
}
Ładowanie obrazu:
Glide.with(context)
.load(imageUrl)
.asBitmap()
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Ponieważ używasz asBitmap (), animacje zostaną jednak usunięte. Możesz użyć własnej animacji w tym miejscu za pomocą metody animate ().
Przykład z podobną domyślną animacją przejścia.
Glide.with(context)
.load(imageUrl)
.asBitmap()
.animate(R.anim.abc_fade_in)
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Uwaga: ta animacja jest prywatnym zasobem biblioteki wsparcia - nie zaleca się jej używania, ponieważ można ją zmienić, a nawet usunąć.
Uwaga: musisz także mieć bibliotekę wsparcia, aby korzystać z RoundedBitmapDrawableFactory
Wstępne ładowanie obrazów
Aby wstępnie załadować zdalne obrazy i upewnić się, że obraz zostanie pobrany tylko raz:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
Następnie:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) // ALL works here too
.into(imageView);
Aby wstępnie załadować lokalne obrazy i upewnić się, że transformowana kopia znajduje się w pamięci podręcznej dysku (a może także w pamięci podręcznej):
Glide.with(context)
.load(yourFilePathOrUri)
.fitCenter() // Or whatever transformation you want
.preload(200, 200); // Or whatever width and height you want
Następnie:
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);
Symbol zastępczy i obsługa błędów
Jeśli chcesz dodać Drawable wyświetlaną podczas ładowania, możesz dodać symbol zastępczy:
Glide.with(context)
.load(yourUrl)
.placeholder(R.drawable.placeholder)
.into(imageView);
Jeśli chcesz wyświetlać Drawable, jeśli ładowanie nie powiedzie się z jakiegokolwiek powodu:
Glide.with(context)
.load(yourUrl)
.error(R.drawable.error)
.into(imageView);
Jeśli chcesz wyświetlać Drawable, jeśli podasz model zerowy (URL, Uri, ścieżka do pliku itp.):
Glide.with(context)
.load(maybeNullUrl)
.fallback(R.drawable.fallback)
.into(imageView);
Załaduj obraz w okrągłym ImageView bez niestandardowych przekształceń
Utwórz niestandardowy BitmapImageViewTarget, aby załadować obraz do:
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);
}
}
Stosowanie:
Glide
.with(context)
.load(yourimageidentifier)
.asBitmap()
.into(new CircularBitmapImageViewTarget(context, imageView));
Obsługa ładowania obrazu schodzenia nie powiodła się
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);
}
});
Tutaj w SET_YOUR_DEFAULT_IMAGE
miejscu możesz ustawić dowolny domyślny Drawable
. Ten obraz zostanie wyświetlony, jeśli ładowanie obrazu nie powiedzie się.