热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

详解Android中Glide与CircleImageView加载圆形图片的问题

最近在项目中遇到了一个奇怪的问题,Glide和CircleImageView一起使用加载圆形头像,发现第一次死活都加载出来,出来的是一张占位

最近在项目中遇到了一个奇怪的问题,Glide和CircleImageView一起使用加载圆形头像,发现第一次死活都加载出来,出来的是一张占位图,当你刷新的时候或者第二次进入的时候才能加载出来。究其原因,CircleImageView 把位置占了。这时候我们有如下4种解决方案,不管是哪一种都是可以解决的(亲测可行)。

1. 不使用占位符

注释掉这两句代码即可。

.placeholder(R.drawable.normal_photo)
    .error(R.drawable.normal_photo)

Glide 加载时的代码:

Glide.with(mContext)
                .load(datas.getUser_img())
                .centerCrop()
                .into(ivAvator);

此时XML中的还是CircleImageView,代码如下:

2. 不使用默认动画

添加一句代码即可:

.dontAnimate()//防止设置placeholder导致第一次不显示网络图片,只显示默认图片的问题

此时Glide加载时的完整代码:

Glide.with(mContext)
        .load(datas.getUser_img())
        .centerCrop()
        .dontAnimate()//防止设置placeholder导致第一次不显示网络图片,只显示默认图片的问题
        .error(R.drawable.normal_photo)
        .placeholder(R.drawable.normal_photo)
        .into(ivAvator);

此时XML中的依然是CircleImageView,这没什么好说的。代码如下:

3. 使用glide本身的圆形加载方式

这里就直接看下Glide加载时的代码,注意:

此时的ivAvator可以使用普通的ImageView,不必再引入CircleImageView第三方框架。(当然你依然可以写成CircleImageView)

asBitmap() 这句不能少,否则下面的方法会报错。

Glide.with(mContext)
       .load(datas.getUser_img())
       .asBitmap() //这句不能少,否则下面的方法会报错
       .centerCrop()
       .into(new BitmapImageViewTarget(ivAvator) {
         @Override
         protected void setResource(Bitmap resource) {
           RoundedBitmapDrawable circularBitmapDrawable =
               RoundedBitmapDrawableFactory.create(getResources(), resource);
           circularBitmapDrawable.setCircular(true);
           ivAvator.setImageDrawable(circularBitmapDrawable);
         }
       });

此时xml中的代码修改成ImageView,代码如下:


4. 同样使用Glide本身的圆形加载方式

这种方式和上面的基本类似。首先GlideCircleTransform继承BitmapTransformation,代码如下:

//圆形图片
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();
  }
}

Glide加载时的代码如下:

Glide.with(mContext)
                .load(datas.getUser_img())
                .centerCrop()
                .error(R.drawable.normal_photo)
                .placeholder(R.drawable.normal_photo)
                .transform(new GlideCircleTransform(mContext))
                .into(ivAvator);

注意: 此时的ivAvator依然可以是ImageView(当然你依然可以写成CircleImageView) 。代码如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
author-avatar
蓜甪紸甪1995
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有