Glide Множественные преобразования в Android

Я использую Glide для загрузки изображений в свое приложение. У меня есть пользовательское преобразование, которое я использую при загрузке изображения в ImageView.
Проблема в том, что я хочу применить свое пользовательское преобразование и centerCrop к полученному изображению. Но Glide использует только мое пользовательское преобразование и отображает изображение в ImageView с fitXY.
Вот мой код:

Glide.with(context)
    .load(uri)
    .placeholder(R.drawable.image_id)
    .transform(new CustomTransformation(context))
    .centerCrop()
    .into(imageView);

Как мне добиться желаемого результата? Любая помощь приветствуется.


person Anjani    schedule 01.08.2015    source источник


Ответы (6)


В Glide v4.6.1 я обнаружил, что класс MultiTransformation упрощает эту задачу:

MultiTransformation<Bitmap> multiTransformation = new MultiTransformation<>(new CustomTransformation(), new CircleCrop());

Glide.with(DemoActivity.this).load(file)
                .apply(RequestOptions.bitmapTransform(multiTransformation))
                .into(mPreviewImageView);
person Nic Dahlquist    schedule 11.06.2018

Создайте свой собственный CustomTransformation, который расширяет CenterCrop, затем при переопределении transform() вызовите super перед выполнением пользовательского преобразования.

Например:

 Glide.with(Context)
                    .load(url)
                    .asBitmap()
                    .transform(new CenterCrop(context) {
                                @Override
                                protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
                                    // Call super to have your image center cropped
                                    toTransform = super.transform(pool, toTransform, outWidth, outHeight);
                                    // Apply your own custom transformation
                                    return ImageUtils.fastblur(toTransform, BLUR_RADIUS);
                                }

                                @Override
                                public String getId() {
                                    return "com.example.imageid"
                                }
                            })
                    .placeholder(placeholder)
                    .into(imageView);
person Orr Matarasso    schedule 10.11.2015

Вы можете применить несколько преобразований следующим образом:

 Glide.with(getContext())
            .load(url)
            .bitmapTransform(new CenterCrop(getContext()), new BlurTransformation(getContext(), BLUR_RADIUS), new GrayscaleTransformation(getContext()))
            .into(imageView);
person Júlia Garrigós    schedule 17.11.2016

В Glide 4.11 мы можем использовать MultiTransformation со списком трансформаций:

GlideApp.with(imageView)
    .load(url)
    .transform(MultiTransformation(CenterCrop(), RoundedCorners(10), Rotate(30)))
    // .error(...)
    .into(imageView)
person CoolMind    schedule 08.09.2020

Лучший способ (особенно с Glide 4, который больше не принимает более одного единственного BitmapTransformation) — создать CombinedTransformation, например так:

class CombinedTransformation(vararg val transformations: Transformation<Bitmap>) 
        : Transformation<Bitmap> {
    override fun transform(context: Context, resource: Resource<Bitmap>, 
                           outWidth: Int, outHeight: Int): Resource<Bitmap> {
        var out = resource
        for (transformation in transformations) {
            out = transformation.transform(context, out, outWidth, outHeight)
        }
        return out
    }
    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        transformations.forEach { it.updateDiskCacheKey(messageDigest) }
    }
}

Затем используйте его так (опять же, Glide 4):

val options = RequestOptions()
options.transform(CombinedTransformation(CenterCrop(...), BlurTransformation(...)))
Glide.with(context).load(url).apply(options).into(imageView)
person Thomas Keller    schedule 29.06.2017
comment
Спасибо за CombinedTransformation(CenterCrop(...), BlurTransformation(...))! Я понял, что мы можем использовать MultiTransformation(CenterCrop(), RoundedCorners(10)). - person CoolMind; 08.09.2020

Синтаксис 2021 ...

Кажется, теперь вам нужно все новое:

protected void setPicture() {

    String url = doc.get("image");

    // the rounding of the products_box is 12dp
    int twelve = _dp(12);

    Glide.with(itemView.getContext())
            .load(url)
            .transform(
               new MultiTransformation(
                  new CenterCrop(),
                  new RoundedCorners(twelve)))
            .into(happy_product_image);
}

(Обратите внимание, что, как обычно, вам нужно будет преобразовать количество DP, например https://stackoverflow.com/a/66459077/294884 )

person Fattie    schedule 28.03.2021