Android中如何设置图片圆角
创始人
2024-12-21 23:00:34
0次

方法一:

通过第三方框架Glide实现图片显示有圆角,有三种写法如下:

1.1、第一种实现:

RequestOptions options = new RequestOptions().error(R.drawable.img_load_failure).bitmapTransform(new RoundedCorners(30));//图片圆角为30Glide.with(this).load(URL) //图片地址    .apply(options)    .into(ImagView);

1.2、第二种实现:

RequestOptions requestOptions = new RequestOptions();requestOptions.placeholder(R.drawable.ic_launcher_background);requestOptions.circleCropTransform();requestOptions.transforms( new RoundedCorners(30));Glide.with(this).load(URL) //图片地址    .apply(options)    .into(ImagView);

1.3、第三种实现:

RequestOptions options = new RequestOptions().centerCrop() .transform(new RoundTransform(this,30)); Glide.with(this).load(URL) //图片地址    .apply(options)    .into(ImagView);

public class RoundTransform extends BitmapTransformation {  private static float radius = 0f;  public RoundTransform(Context context) {   this(context, 4);  }   public RoundTransform(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) {   Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);   return roundCrop(pool, bitmap);  }   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;  }   public String getId() {   return getClass().getName() + Math.round(radius);  }   @Override  public void updateDiskCacheKey(MessageDigest messageDigest) {   }}

方法二:

自定义ImageView:

ImageView iv = findViewById(R.id.iv); Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.fengjing);  Bitmap outBitmap =getRoundBitmapByShader(bitmap, 500,300,20, 3);  iv.setImageBitmap(outBitmap);

public class RoundRectImageView extends ImageView{  private Paint paint;  public RoundRectImageView(Context context) {  this(context,null); }  public RoundRectImageView(Context context, AttributeSet attrs) {  this(context, attrs,0); }  public RoundRectImageView(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle);  paint = new Paint(); }  /**  * 绘制圆角矩形图片  * @author caizhiming  */ @Override protected void onDraw(Canvas canvas) {  Drawable drawable = getDrawable();  if (null != drawable) {   Bitmap bitmap = getBitmapFromDrawable(drawable);//   Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();   Bitmap b = getRoundBitmapByShader(bitmap,getWidth(),getHeight(), 50,0);   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);  } }  /**  * 把资源图片转换成Bitmap  * @param drawable  * 资源图片  * @return 位图  */ public static Bitmap getBitmapFromDrawable(Drawable drawable) {  int width = drawable.getIntrinsicWidth();  int height = drawable.getIntrinsicHeight();  Bitmap bitmap = Bitmap.createBitmap(width, height, drawable    .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888    : Bitmap.Config.RGB_565);  Canvas canvas = new Canvas(bitmap);  //drawable.setBounds(-4, -4, width + 4, height + 4);  drawable.draw(canvas);  return bitmap; }  public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) {  if (bitmap == null) {   return null;  }  int width = bitmap.getWidth();  int height = bitmap.getHeight();  float widthScale = outWidth * 1f / width;  float heightScale = outHeight * 1f / height;   Matrix matrix = new Matrix();  matrix.setScale(widthScale, heightScale);  //创建输出的bitmap  Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);  //创建canvas并传入desBitmap,这样绘制的内容都会在desBitmap上  Canvas canvas = new Canvas(desBitmap);  Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  //创建着色器  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);  //给着色器配置matrix  bitmapShader.setLocalMatrix(matrix);  paint.setShader(bitmapShader);  //创建矩形区域并且预留出border  RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder);  //把传入的bitmap绘制到圆角矩形区域内  canvas.drawRoundRect(rect, radius, radius, paint);   if (boarder > 0) {   //绘制boarder   Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);   boarderPaint.setColor(Color.GREEN);   boarderPaint.setStyle(Paint.Style.STROKE);   boarderPaint.setStrokeWidth(boarder);   canvas.drawRoundRect(rect, radius, radius, boarderPaint);  }  return desBitmap; } }

方法三:

对图片进行处理,此方法还可以加边框

/** * 通过BitmapShader实现圆形边框 * @param bitmap  * @param outWidth 输出的图片宽度 * @param outHeight 输出的图片高度 * @param radius 圆角大小 * @param boarder 边框宽度 */public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) { if (bitmap == null) {  return null; } int height = bitmap.getHeight(); int width = bitmap.getWidth();  float widthScale = outWidth * 1f / width; float heightScale = outHeight * 1f / height;  Matrix matrix = new Matrix(); matrix.setScale(widthScale, heightScale); //创建输出的bitmap Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888); //创建canvas并传入desBitmap,这样绘制的内容都会在desBitmap上 Canvas canvas = new Canvas(desBitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //创建着色器 BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); //给着色器配置matrix bitmapShader.setLocalMatrix(matrix); paint.setShader(bitmapShader); //创建矩形区域并且预留出border RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder); //把传入的bitmap绘制到圆角矩形区域内 canvas.drawRoundRect(rect, radius, radius, paint);  if (boarder > 0) {  //绘制boarder  Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  boarderPaint.setColor(Color.GREEN);  boarderPaint.setStyle(Paint.Style.STROKE);  boarderPaint.setStrokeWidth(boarder);  canvas.drawRoundRect(rect, radius, radius, boarderPaint); } return desBitmap;}

实现圆形和边框:

/** * 通过BitmapShader实现圆形边框 * @param bitmap  * @param outWidth 输出的图片宽度 * @param outHeight 输出的图片高度 * @param boarder 边框大小 */public static Bitmap getCircleBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int boarder) {int radius;int width = bitmap.getWidth();int height = bitmap.getHeight();float widthScale = outWidth * 1f / width;float heightScale = outHeight * 1f / height; Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);if (outHeight > outWidth) { radius = outWidth / 2;} else { radius = outHeight / 2;}//创建canvasCanvas canvas = new Canvas(desBitmap);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);Matrix matrix = new Matrix();matrix.setScale(widthScale, heightScale);bitmapShader.setLocalMatrix(matrix);paint.setShader(bitmapShader);canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, paint);if (boarder > 0) { //绘制boarder Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); boarderPaint.setColor(Color.GREEN); boarderPaint.setStyle(Paint.Style.STROKE); boarderPaint.setStrokeWidth(boarder); canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, boarderPaint);}return desBitmap;}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...