一、问题引入

Android开发中经常要使用到ImageView,而ImageView控件自带的宽度width、高度height等属性无法让ImageView呈现出圆形、圆角这样的形状,相信很多小伙伴都和我一样为这个问题苦恼,现在介绍几种方法,可以很方便地实现圆形图片。

二、方法总结

方法一:使用Glide(推荐使用)

  • 在build.gradle中引入Glide包:implementation 'com.github.bumptech.glide:glide:3.7.0'
  • 在Activity中引入Glide包等
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
  • 圆形图片
// context表示当前所在活动,例如MainActivity.this
// url表示图片资源网址或本地资源R.drawable.icon等
// apply应用圆形变换方法
// image表示布局中的ImageView控件
context = MainActivity.this
url = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242332225H9-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1652004122&t=70e3b52d14b9bf1bb2d795b7e1d32bf5"
image = (ImageView) findViewById(R.id.image);
Glide.with(context).load(url).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(image);
  • 圆角图片
// context表示当前所在活动,例如MainActivity.this
// url表示图片资源网址或本地资源R.drawable.icon等
// apply应用圆形变换方法,10表示圆角半径
// image表示布局中的ImageView控件
context = MainActivity.this
url = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242332225H9-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1652004122&t=70e3b52d14b9bf1bb2d795b7e1d32bf5"
image = (ImageView) findViewById(R.id.image);
Glide.with(context).load(url).apply(RequestOptions.bitmapTransform(new RoundedCorners(10))).into(image);

方法二:使用自定义的RoundImageView(实现圆形)

  • 自定义RoundImageView.java,代码如下所示:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;public class RoundImageView extends androidx.appcompat.widget.AppCompatImageView{private Paint paint;public RoundImageView(Context context) {this(context, null);}public RoundImageView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RoundImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);paint = new Paint();}protected void onDraw(Canvas canvas) {Drawable drawable = getDrawable();if (null != drawable) {Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();Bitmap b = getCircleBitmap(bitmap, 14);final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());final Rect rectDest = new Rect(0,0,getWidth(),getHeight());paint.reset();canvas.drawBitmap(b, rectSrc, rectDest, paint);} else {super.onDraw(canvas);}}private Bitmap getCircleBitmap(Bitmap bitmap, int pixels) {Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);int x = bitmap.getWidth();canvas.drawCircle(x / 2, x / 2, x / 2, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return output;}
}
  • 直接在布局文件中引入,示例如下:
<com.example.weibo.RoundImageViewandroid:id="@+id/roundIcon"android:layout_width="40dp"android:layout_height="40dp"android:layout_margin="5dp"
/>

方法三:使用RoundedBitmapDrawable(老版本,不推荐使用)

  • RoundedBitmapDrawable位于android .support.v4.graphics.drawable,需在build.gradle中引入v4系列的包
  • 圆形图片
    setCircular(boolean circular) : 把图片的形状设为圆形
// 从Drawable资源中获取图片存入bitmap,设为圆形并存入ImageView控件
ImageView image = findViewById(R.id.image);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.photo);
RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
roundedBitmapDrawable.setCircular(true);
image.setImageDrawable(roundedBitmapDrawable);
  • 圆角图片
    setCornerRadius(float cornerRadius) : 设置图片的圆角半径
ImageView image = findViewById(R.id.image);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.photo);
RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
roundedBitmapDrawable.setCornerRadius(100);
image.setImageDrawable(roundedBitmapDrawable);

Android加载圆形(圆角)图片的方式总结(RoundedBitmapDrawable、Glide)相关推荐

  1. 安卓图片加载之使用universalimageloader加载圆形圆角图片

    前言 话说这universalimageloader加载图片对搞过2年安卓程序都是用烂了再熟悉不过了,就是安卓新手也是百度就会有一大堆东西出来,今天为什么这里还要讲使用universalimagelo ...

  2. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...

     Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...

  3. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】

     Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...

  4. Android 自定义View 圆形圆角图片

    [Android 自定义View 圆形圆角图片] 基于Xfermode 实现 1.概述 在很久以前也写过一个利用Xfermode 实现圆形.圆角图片的(Android 完美实现图片圆角和圆形(对实现进 ...

  5. QML for Android 加载图片资源的几种方式

    前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...

  6. gif android 点击 加载,android 加载显示gif图片的解决方案

    使用方法: 1-把GifView.jar加入你的项目. 2-在xml中配置GifView的基本属性,GifView继承自View类,和Button.ImageView一样是一个UI控件.如: andr ...

  7. android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM

    开发中给ImageView加载一个高质量图片时,APP抛出了"Canvas: trying to draw too large(840253440bytes) bitmap."的异 ...

  8. android 动态图形,Android 加载GIF动态图片

    项目中遇到需要播放一张GiF图片,虽然网上有很多的框架和代码,还是要记录一下的!!! 1.加载框架 compile 'pl.droidsonroids.gif:android-gif-drawable ...

  9. android 加载多个图片 内在溢出的问题

    很多人习惯把 多个图片都加载到内存中,然后使用 这往往让那可怜的8M不够用 目前找到的一个合理点的方法是 加载这多个图片的地址到内存中 要用到哪个时去加载这个图片. 转载于:https://www.c ...

最新文章

  1. Django框架(十)--常用字段、参数、元信息、多对多关联关系
  2. html 常用方法,jquery的常用方法有哪些?
  3. mysql sp cursoropen_三个重要的游标sp_cursoropen_MySQL
  4. 微信之父张小龙:产品经理的必备书单(转)
  5. VC++ 解析JSON 学习总结
  6. 判断frame是否已创建_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...
  7. 苹果首席芯片设计师离职 曾领导自A7以来所有芯片设计
  8. Java中常见的异常有哪些?
  9. express to eSATA卡测试
  10. Python实现离散Radon变换
  11. 将已购买的知乎Live课堂图片下载并导出的教程
  12. Amap【高德】/Google-开发,无人机航迹规划演示
  13. 神经网络训练算法的调用,人工神经网络训练案例
  14. JavaScript 数组array 插入[ push() ] 与 删除[ splice() ]
  15. java get方法_java get方法
  16. 分享精美电脑主题壁纸09-01整理更新分享!
  17. 一个简单的登录界面设计
  18. 网页如何旋转90度?
  19. zjyxmdshoes
  20. 用C语言写飞机小游戏

热门文章

  1. Android的GridView中的选中图标后图标的背景颜色
  2. ASP.net:关于何种情况下使用DataGrid、DataList或Repeater
  3. 蝙蝠变身吸血鬼js网页动画
  4. python制作进度条显示_Python进度条的制作代码实例
  5. Chrome浏览器的用法
  6. Object有哪些基本的方法
  7. android:apn相关资料
  8. Serializable是什么
  9. ideaiu初始化设置
  10. Android中使用全局变量(转)