Android
скольжение
Поиск…
Вступление
**** ПРЕДУПРЕЖДЕНИЕ Эта документация не поддерживается и часто неточна ****
Официальная документация Glide - гораздо лучший источник:
Для Glide v4 см. Http://bumptech.github.io/glide/ . Для Glide v3 см. Https://github.com/bumptech/glide/wiki .
замечания
Glide - это быстрый и эффективный механизм управления медиафайлами и изображений для Android с открытым исходным кодом, который включает в себя декодирование носителей, кеширование памяти и дисков, а также объединение ресурсов в простой и удобный интерфейс.
Glide поддерживает выборку, декодирование и отображение видеопотоков, изображений и анимированных GIF-файлов. Glide включает гибкий API, который позволяет разработчикам подключаться практически к любому сетевому стеклу.
По умолчанию Glide использует собственный стек, основанный на HttpUrlConnection , но также включает в себя библиотеки утилиты, подключаемые к проекту Volley Google или библиотеке OkHttp Square .
Основное внимание Glide уделяется тому, чтобы прокручивать любой вид списка изображений как можно более гладко и быстро, но Glide также эффективен практически для любого случая, когда вам нужно выбирать, изменять размер и отображать удаленное изображение.
Исходный код и дальнейшая документация доступны на GitHub: https://github.com/bumptech/glide
Добавьте Glide в свой проект
С 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'
}
С 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>
В зависимости от конфигурации и использования ProGuard (DexGuard) вам также может потребоваться включить следующие строки в ваш proguard.cfg (см. Дополнительную информацию о Glide's 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
Загрузка изображения
ImageView
Чтобы загрузить изображение с указанного URL, Uri, идентификатор ресурса или любую другую модель в ImageView
:
ImageView imageView = (ImageView) findViewById(R.id.imageView);
String yourUrl = "http://www.yoururl.com/image.png";
Glide.with(context)
.load(yourUrl)
.into(imageView);
Для Uris замените yourUrl
своим Uri ( content://media/external/images/1
). Для Drawables замените yourUrl
вашим идентификатором ресурса ( R.drawable.image
).
RecyclerView и ListView
В ListView или RecyclerView вы можете использовать точно такие же строки:
@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);
}
Если вы не хотите запускать загрузку в onBindViewHolder
, убедитесь, что вы onBindViewHolder
clear()
любой ImageView
Glide, который может управлять до изменения 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);
}
}
Преобразование кругового круга (Загрузка изображения в круговом ImageView)
Создайте круглое изображение со скольжением.
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();
}
}
Использование:
Glide.with(context)
.load(yourimageurl)
.transform(new CircleTransform(context))
.into(userImageView);
Преобразования по умолчанию
Glide включает в себя два преобразования по умолчанию, по центру и центру.
Подходящий центр:
Glide.with(context)
.load(yourUrl)
.fitCenter()
.into(yourView);
Fit center выполняет те же преобразования, что и ScaleType Android. FIT_CENTER .
Центровая культура:
Glide.with(context)
.load(yourUrl)
.centerCrop()
.into(yourView);
Центральная обрезка выполняет ту же трансформацию, что и Android ScaleType.CENTER_CROP .
Для получения дополнительной информации см. Wiki в Glide .
Изображение с закругленными углами с закругленными углами с пользовательской целью Glide
Сначала создайте класс утилиты или используйте этот метод в классе
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);
}
};
}
Загрузка изображения:
Glide.with(context)
.load(imageUrl)
.asBitmap()
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Поскольку вы используете asBitmap (), анимация будет удалена, хотя. Вы можете использовать свою собственную анимацию в этом месте, используя метод animate ().
Пример с аналогичной затухающей анимацией Glide по умолчанию.
Glide.with(context)
.load(imageUrl)
.asBitmap()
.animate(R.anim.abc_fade_in)
.into(UIUtils.getRoundedImageTarget(context, imageView, radius));
Обратите внимание, что эта анимация - это вспомогательный ресурс библиотеки поддержки - она не рекомендуется использовать, поскольку она может быть изменена или даже удалена.
Обратите внимание, что вам также необходимо иметь библиотеку поддержки для использования RoundedBitmapDrawableFactory
Предварительная загрузка изображений
Чтобы предварительно загрузить удаленные изображения и убедитесь, что изображение загружается только один раз:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
Затем:
Glide.with(context)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE) // ALL works here too
.into(imageView);
Чтобы предварительно загрузить локальные изображения и убедитесь, что преобразованная копия находится в кеше диска (и, возможно, в кеше памяти):
Glide.with(context)
.load(yourFilePathOrUri)
.fitCenter() // Or whatever transformation you want
.preload(200, 200); // Or whatever width and height you want
Затем:
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);
Обработка заполнителя и ошибок
Если вы хотите добавить Drawable, который будет отображаться во время загрузки, вы можете добавить местозаполнитель:
Glide.with(context)
.load(yourUrl)
.placeholder(R.drawable.placeholder)
.into(imageView);
Если вы хотите, чтобы Drawable отображался, если сбой по какой-либо причине:
Glide.with(context)
.load(yourUrl)
.error(R.drawable.error)
.into(imageView);
Если вы хотите, чтобы Drawable отображался, если вы предоставили нулевую модель (URL, Uri, путь к файлу и т. Д.):
Glide.with(context)
.load(maybeNullUrl)
.fallback(R.drawable.fallback)
.into(imageView);
Загрузить изображение в круговом ImageView без пользовательских преобразований
Создайте собственный BitmapImageViewTarget, чтобы загрузить изображение:
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);
}
}
Использование:
Glide
.with(context)
.load(yourimageidentifier)
.asBitmap()
.into(new CircularBitmapImageViewTarget(context, imageView));
Не удалось загрузить загрузку изображения 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);
}
});
Здесь, в SET_YOUR_DEFAULT_IMAGE
вы можете установить любой по умолчанию Drawable
. Это изображение будет показано, если загрузка изображения не удалась.