首页 > 其他分享 >Android开发:使用Glide动态加载圆形图片和圆角图片

Android开发:使用Glide动态加载圆形图片和圆角图片

时间:2023-05-06 14:04:07浏览次数:72  
标签:Glide Bitmap source result new Android size 图片


最新消息,鼎鼎大名的Yelp应用也转投Glide的阵营了,而且Glide在跟Listview的配合起来非常的顺畅,Glide除了配置简单,还可以本地缓存图片,也可以实现Listview图片的提前预加载,使得listview的更加的顺滑,具体可以查看Yelp的那篇博文。

但是如果碰到要把加载下来的图片转成圆角或者圆形的图片,怎么处理呢,Glide原生没有这个方法,于是我拓展了BitmapTransformation来实现这个功能。

请先看效果图:


Android开发:使用Glide动态加载圆形图片和圆角图片_ide

Glide是默认本地存储的,但重复加载的时候,是不需要重复访问网络。

下载的图片转圆形的方法

public class GlideCircleTransform extends BitmapTransformation {
    public GlideCircleTransform(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;

        // TODO this could be acquired from the pool too
        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();
    }
}



自定义一个extend BitmapTransformation的方法,把获得的bitmap转化成圆形图片,下面是使用方法

private RequestManager glideRequest;
glideRequest = Glide.with(this);
glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideCircleTransform(context)).into(imageView);



这里不得不强调下Glide的一个强大的功能,当你在With后面的传Activity或者Fragment,Glide就可以根据当前Activity或者Fragment的生命周期维护图片的生命周期,比如但activity销毁的时候,就会自动取消需要加载的图片

下载图片转换层圆角图片的方法

public class GlideRoundTransform extends BitmapTransformation {

    private static float radius = 0f;

    public GlideRoundTransform(Context context) {
        this(context, 4);
    }

    public GlideRoundTransform(Context context, int dp) {
        super(context);
        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
    }

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

    private static Bitmap roundCrop(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() + Math.round(radius);
    }
}



在这个方法里面,你可以自定义圆角的大小,使用方式也非常简单

glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context)).into(imageView);

glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context, 10)).into(imageView);



Glide的详细的使用方法可以参考官方的文档,这里是作为加载图片效果的一个补充,一人觉得目前Glide已经很成熟了,可以考虑应用到实际的项目中去,目前还有一个很强大的图片加载框架,叫做Fresco,Facebook开发的,star的数量是超过Glide的,不过本人还是倾向于使用Glide,基本上Glide已经可以满足我所有的功能,再加上图片的圆角处理这里也实现了,至于Fresco个人感觉偏复杂了点,还是Glide使用起来比较轻便,故推荐Glide。


标签:Glide,Bitmap,source,result,new,Android,size,图片
From: https://blog.51cto.com/u_16099425/6249594

相关文章

  • Android开发中的一个小功能 清空搜索框的文字
    需求:项目中的有关搜索的地方,加上清空文字的功能,目的是为了增加用户体验,使用户删除文本更加快捷解决过程:开始的时候感觉这个东西不太好实现,主要就是布局的问题,可能是开始顾虑的太多了,再加上当时产品催的不太紧,而且这个功能也不是必须实现的。但是今天不一样了,这个是老大让加上的,说别......
  • android 获取屏幕高度和宽度 的方法
    Android 获取屏幕高度和宽度的方法  我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸   下面的代码即可获取屏幕的尺寸。    在一个Activity的onCreate方法中,写入如下代码:[java] vi......
  • Android 布局设计新思路
    [YouTube](AndroidSpeechRecognition-Part1-YouTube---Android语音识别-第1部分-YouTube)......
  • Android 横竖屏切换适配
    Android横竖屏幕切换(layout-land和layout-port)(betheme.net)  创建(layout-land和layout-port)文件夹 land是横向port是竖向 (332条消息)layout的横竖屏处理_layout横屏显示_ycb1689的博客-CSDN博客  ......
  • Android 屏幕适配
    一、概念1.1屏幕像素密度PPI、DPIPPI(PixelsPerInch)屏幕每英寸容纳多少个像素点,DPI(DotsPerInch)这个“点”是根据屏幕物理概念产生的一个软件概念,在不同行业有不同理解,印刷行业每英寸打印多少个墨点,鼠标移动一英寸光标移动多少像素点,在Android中被用来表示屏幕每英寸显示多......
  • Android开发--WebView, WebChromeClient和WebViewClient
     WebView是AndroidAPP用来处理html页面的一个组件webview是android中的浏览器控件,在一些手机应用中常会用到b/s模式去开发应用,这时webview的强大功能就会显示出来。webview的几点设置   权限设置:.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会......
  • Android开发--事件绑定及startActivity、startActivityForResult区别
      一、绑定事件的方法:1、方法一:UI组件事件属性调用main.xml:<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="forWard"an......
  • Android开发--架构详解
    Android体系架构详解:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/#ibm-pcon    src文件夹是项目的所有包及源文件(.java)(与一般的Java项目一样)分析HelloAndroid项目的主程序文件HelloAndroid.java,如代码清单3-8所示。代码清单3-8HelloAndroid.java......
  • deepspeech_android_devices_support
    AndroiddevicessupportWehavesupportforAndroidrelyingonTensorFlowLite,withJavaandJNIbindinds.Formoredetailsonhowtoexperimentwiththose,pleaserefertothesectionbelow.PleaserefertoTensorFlowdocumentationonhowtosetupthee......
  • Android 数据存储
    概述文件存储特点:openFileInput()和openFileOutput()读取设备上的文件。SharedPreferences特点:以XML格式将数据存储到设备。SQLite数据库特点:运算速度快,占用资源少,还支持基本SQL语法。ContentProvider特点:应用程序之间的数据交换,可以将自己的数据共享给其他应用......