Glide

入门系列

图片的剪裁

ImageView 缩放裁剪
ImageView 默认的 ScaleType 是 FIT_CENTER

当图片大于视图,CENTER_INSIDE 逻辑与 FIT_CENTER 一致,当 图片小于视图时,CENTER_INSIDE 逻辑与 CENTER 一致。

//---ImageView
public enum ScaleType {
        //不缩放 ,图片与控件 左上角 对齐,当图片大小超过控件时将被 裁剪
        MATRIX      (0),

        /**
         * 填充
         */
        FIT_XY      (1),

        //自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠左(上)显示
        FIT_START   (2),

        //自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,居中显示
        FIT_CENTER  (3),

        //自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠右(下)显示
        FIT_END     (4),

        //不缩放 ,图片与控件 中心点 对齐,当图片大小超过控件时将被 裁剪
        CENTER      (5),
  
        //以填满整个控件为目标,等比缩放,超过控件时将被 裁剪 ( 宽高都要填满 ,所以只要图片宽高比与控件宽高比不同时,一定会被剪裁)
        CENTER_CROP (6),
        //以完整显示图片为目标, 不剪裁 ,当显示不下的时候将缩放,能够显示的情况下不缩放
        CENTER_INSIDE (7);

        ScaleType(int ni) {
            nativeInt = ni;
        }
        final int nativeInt;

}

图片压缩

图片质量

图片质量类型

ARGB_8888 :32位图,带透明度,每个像素占4个字节
ARGB_4444 :16位图,带透明度,每个像素占2个字节
RGB_565 :16位图,不带透明度,每个像素占2个字节
ALPHA_8 :32位图,只有透明度,不带颜色,每个像素占4个字节
(A代表透明度,RGB代表红绿蓝:即颜色)

图片默认质量

Picasso的默认质量是 ARGB_8888
Glide的默认质量则为 RGB_565

加载一张4000 * 2000px的图片

Picasso需要占用的内存为: 32MB

4000 * 2000 * 4 / 1024 / 1024 = 30 (MB)

Glide需要占用的内存为: 16MB

4000 * 2000 * 2 / 1024 / 1024 = 15 (MB)

如果不做图片压缩,哪怕 ImageView 的宽高只有10px,同样会占用那么多内存,很容易就 OOM 了。

压缩

使用 override 方法

Glide.with(this).load(mUrl).override(300,300).into(mIv);

图片预处理(圆角,高斯模糊)

使用多个transform
transform方法是不支持多次调用的,如果你调用了两次,那么第二次的会覆盖了第一次的效果

但是他有一个重载的方法可以传入多个对象,这样传入的变形器都能够生效


Glide.with(this).load(url).transform(new 
CircleTransform(this),new CornersTransform(this,50)).into(iv1);

自定义圆角

Glide.with(this).load(url).transform(new CornersTransform(this,50)).into(iv1);

public  class CornersTransform extends BitmapTransformation {
    private float radius;

    public CornersTransform(Context context) {
        super(context);
        radius = 10;
    }

    public CornersTransform(Context context, float radius) {
        super(context);
        this.radius = radius;
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return cornersCrop(pool, toTransform);
    }

    private Bitmap cornersCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint  paint  = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}

GlideModule

GlideModule

Glide 加载 GIF 和 MP4

GIF

GIF与普通图片加载方式一致

仅静态展示第一帧(asBitmap())

Glide.with(this).load(mGifUrl).asBitmap().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

仅加载gif(adGif())
Glide.with(this).load(mGifUrl).asGif().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

MP4

Glide只会加载本地视频的第一帧,也就是缩略图,而且其实加载缩略图的时候也无需转化为Uri,直接把File丢进去就行了

上一篇:CSS——图片自适应宽高


下一篇:Center Loss