• Glide


    入门系列
    Glide-Github

    图片的剪裁

    没有调用transform方法的时候,在Glide调用into方法时,会根据你设置的ScaleType来判断处理。

    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;
    
    }
    
    
    

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

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

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

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

    与 fitCenter()、CenterCrop()、CircleCrop() 冲突(该方法也是通过transform实现,会被覆盖)
    This will override previous calls to {@link #dontTransform()}

    自定义圆角

    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();
        }
    }
    
    

    图片压缩

    图片质量

    图片质量类型

    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);

    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丢进去就行了

    缓存

    本地磁盘缓存大小 250MB
    内存缓存最大空间 进程最大可用内存 * 0.4
    磁盘缓存目录
    磁盘缓存目录: 项目/cache/image_manager_disk_cache

    Glide的内存缓存和磁盘缓存的配置相互没有直接影响,所以可以同时进行配置

    内存缓存策略(skipMemoryCache)

    Glide默认是会在内存中缓存处理图(RESULT)的.

    可以通过调用skipMemoryCache(true)来设置跳过内存缓存

        //跳过内存缓存
        Glide.with(this).load(mUrl).skipMemoryCache(true).into(mIv);
    

    调用skipMemoryCache(false)没有代码上的意义,因为Glide默认就是不跳过内存缓存的,但是显示调用这个方法,可以让别人一目了然的知道你这次请求是会在内存中缓存的,所以还是建议显示调用一下这个方法来表明你的内存缓存策略

    磁盘缓存策略(diskCacheStrategy)

    Glide磁盘缓存策略分为四种,默认的是RESULT(默认值这一点网上很多文章都写错了,但是这一点很重要):

    1.ALL:缓存原图(SOURCE)和处理图(RESULT)

    2.NONE:什么都不缓存

    3.SOURCE:只缓存原图(SOURCE)

    4.RESULT:只缓存处理图(RESULT) —默认值

    清除所有缓存
    清除所有内存缓存(需要在Ui线程操作)

    Glide.get(this).clearMemory();

    清除所有磁盘缓存(需要在子线程操作)

    Glide.get(MainActivity.this).clearDiskCache();

    注:在使用中的资源不会被清除

    由于文件名被哈希过,所以没有清除单个缓存的好方法

    >>>按时吃饭,多喝热水,适量锻炼,祝你平安
  • 相关阅读:
    Nginx会话保持之nginx-sticky-module模块
    企业级分布式应用服务EDAS _Dubbo商业版_微服务PaaS平台 【EDAS Serverless 运维 创业】
    git repository description
    运维成长
    jenkins+maven+tomcat集群发布
    Leaf——美团点评分布式ID生成系统 UUID & 类snowflake
    tomcat redis 集群 session共享
    JEECG & JEESite Tomcat集群 Session共享
    分布式Tomcat session会话Sticky Sessions问题
    Memcached 集群架构与memcached-session-manager
  • 原文地址:https://www.cnblogs.com/sinjin/p/15123460.html
Copyright © 2020-2023  润新知