欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中Glide加载圆形图片和圆角图片实例代码

程序员文章站 2023-11-30 23:38:58
一、简介: 介绍两种使用 bitmaptransformation 来实现 glide 加载圆形图片和圆角图片的方法。glide 并不能直接支持 round pict...

一、简介:

介绍两种使用 bitmaptransformation 来实现 glide 加载圆形图片和圆角图片的方法。glide 并不能直接支持 round pictures ,需要使用 bitmaptransformation 来进行处理。

二、网上的实现方式

这里介绍下网上常见的方式和使用 roundedbitmapdrawable 两种方法,本质上是差不多的:

  1. 使用 canvas 和 paint 来绘制
  2. 使用 android.support.v4.graphics.drawable.roundedbitmapdrawable

实现圆形图片:

/**
 * 
 * glide 圆形图片 transform
 */

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;
    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 圆角 transform
 */

public class glideroundtransform extends bitmaptransformation {

  private static float radius = 0f;

  /**
 * 构造函数 默认圆角半径 4dp
 *
 * @param context context
 */
  public glideroundtransform(context context) {
    this(context, 4);
  }

  /**
 * 构造函数
 *
 * @param context context
 * @param dp 圆角半径
 */
  public glideroundtransform(context context, int dp) {
    super(context);
    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);
  }
}

三、笔者比较喜欢的简便的实现方式

//加载圆角图片
   public static void loadroundimage(final context context, string url,final imageview imageview){
     glide.with(context)
         .load(url)
         .asbitmap()
         .placeholder(placeholder)
         .error(placeholder)
         .diskcachestrategy(diskcachestrategy.all) //设置缓存
         .into(new bitmapimageviewtarget(imageview){
           @override
           protected void setresource(bitmap resource) {
             super.setresource(resource);
             roundedbitmapdrawable circularbitmapdrawable =
                 roundedbitmapdrawablefactory.create(context.getresources(), resource);
             circularbitmapdrawable.setcornerradius(10); //设置圆角弧度
             imageview.setimagedrawable(circularbitmapdrawable);
           }
         });
   }


  //加载圆形图片
  public static void loadcirclepic(final context context, string url, final imageview imageview) {
    glide.with(context)
        .load(url)
        .asbitmap()
        .placeholder(placeholder)
        .error(placeholder)
        .diskcachestrategy(diskcachestrategy.all) //设置缓存
        .into(new bitmapimageviewtarget(imageview) {
          @override
          protected void setresource(bitmap resource) {
            roundedbitmapdrawable circularbitmapdrawable =
                roundedbitmapdrawablefactory.create(context.getresources(), resource);
            circularbitmapdrawable.setcircular(true);
            imageview.setimagedrawable(circularbitmapdrawable);
          }
        });

  }

关于drawabletobitmap的源码的实现是这样的

public static bitmap drawabletobitmap(drawable drawable) {
    // 取 drawable 的长宽
    int w = drawable.getintrinsicwidth();
    int h = drawable.getintrinsicheight();

    // 取 drawable 的颜色格式
    bitmap.config config = drawable.getopacity() != pixelformat.opaque ? bitmap.config.argb_8888
        : bitmap.config.rgb_565;
    // 建立对应 bitmap
    bitmap bitmap = bitmap.createbitmap(w, h, config);
    // 建立对应 bitmap 的画布
    canvas canvas = new canvas(bitmap);
    drawable.setbounds(0, 0, w, h);
    // 把 drawable 内容画到画布中
    drawable.draw(canvas);
    return bitmap;
  }
/**
 * roundedbitmapdrawable 是 v4 下的一个类,不能简单的通过:强制转换成 bitmapdrawable
 * bitmap bitmap = ((bitmapdrawable)xxx).getbitmap();
 */

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