Android加载圆形(圆角)图片的方式总结(RoundedBitmapDrawable、Glide)
一、问题引入
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)相关推荐
- 安卓图片加载之使用universalimageloader加载圆形圆角图片
前言 话说这universalimageloader加载图片对搞过2年安卓程序都是用烂了再熟悉不过了,就是安卓新手也是百度就会有一大堆东西出来,今天为什么这里还要讲使用universalimagelo ...
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...
- Android 自定义View 圆形圆角图片
[Android 自定义View 圆形圆角图片] 基于Xfermode 实现 1.概述 在很久以前也写过一个利用Xfermode 实现圆形.圆角图片的(Android 完美实现图片圆角和圆形(对实现进 ...
- QML for Android 加载图片资源的几种方式
前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...
- gif android 点击 加载,android 加载显示gif图片的解决方案
使用方法: 1-把GifView.jar加入你的项目. 2-在xml中配置GifView的基本属性,GifView继承自View类,和Button.ImageView一样是一个UI控件.如: andr ...
- android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM
开发中给ImageView加载一个高质量图片时,APP抛出了"Canvas: trying to draw too large(840253440bytes) bitmap."的异 ...
- android 动态图形,Android 加载GIF动态图片
项目中遇到需要播放一张GiF图片,虽然网上有很多的框架和代码,还是要记录一下的!!! 1.加载框架 compile 'pl.droidsonroids.gif:android-gif-drawable ...
- android 加载多个图片 内在溢出的问题
很多人习惯把 多个图片都加载到内存中,然后使用 这往往让那可怜的8M不够用 目前找到的一个合理点的方法是 加载这多个图片的地址到内存中 要用到哪个时去加载这个图片. 转载于:https://www.c ...
最新文章
- Django框架(十)--常用字段、参数、元信息、多对多关联关系
- html 常用方法,jquery的常用方法有哪些?
- mysql sp cursoropen_三个重要的游标sp_cursoropen_MySQL
- 微信之父张小龙:产品经理的必备书单(转)
- VC++ 解析JSON 学习总结
- 判断frame是否已创建_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...
- 苹果首席芯片设计师离职 曾领导自A7以来所有芯片设计
- Java中常见的异常有哪些?
- express to eSATA卡测试
- Python实现离散Radon变换
- 将已购买的知乎Live课堂图片下载并导出的教程
- Amap【高德】/Google-开发,无人机航迹规划演示
- 神经网络训练算法的调用,人工神经网络训练案例
- JavaScript 数组array 插入[ push() ] 与 删除[ splice() ]
- java get方法_java get方法
- 分享精美电脑主题壁纸09-01整理更新分享!
- 一个简单的登录界面设计
- 网页如何旋转90度?
- zjyxmdshoes
- 用C语言写飞机小游戏