当前位置:首页 > 谈天说地

Android中图片圆角三种实现方法

34资源网2022-02-04721
目录
  • 方法一
  • 方法二
  • 方法三

android 开发中,经常需要对图片进行二次处理,比如添加圆角效果 或 显示圆形图片;

方法一

通过第三方框架 glide 设置圆角效果;

写法1:

requestoptions options = new requestoptions().error(r.drawable.img_load_failure).bitmaptransform(new roundedcorners(30));//图片圆角为30
glide.with(this).load(url) //图片地址
                .apply(options)
                .into(imagview);

写法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);

写法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
        android:id="@+id/iv"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerhorizontal="true"
        />
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();
    }
 
    /**
     * 绘制圆角矩形图片
     */
    @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;
}
//创建canvas
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 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;
}

到此这篇关于android中图片圆角三种实现方法的文章就介绍到这了,更多相关android图片圆角内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

版权声明:34楼发布

本文链接:https://www.34l.com/post/7028.html

分享给朋友:

相关文章

英国正在调查一种新出现的变异病毒

英国正在调查一种新出现的变异病毒

新华社伦敦3月11日电(记者张家伟 金晶)英国英格兰公共卫生局11日表示,该国近期确诊两例感染了一种新的变异新冠病毒的病例,目前正在对这一新的变异病毒开展调查。…

视频号怎么开通微信小商店技巧流程方法分享

视频号怎么开通微信小商店技巧流程方法分享

这两年直播的风口一直高居不下,微信终于也跟上了直播热潮,视频号直播新增购物车功能,已经开通了小商店的视频号,可以在直播中上架小商店商品,直播过程可以展示并售卖商品。视频号直播带货无疑让更多创作者加入其中,同时也意味着视频号功能的进一步完善,…

闪客快跑2背景音乐(闪客快打andylaw的微博)

闪客快跑2背景音乐(闪客快打andylaw的微博)

《疯狂跑酷》是一款LowPoly(低多边形)画风的跑酷游戏,一场突如其来的大水淹没了城市,而你在游戏中扮演一名刚下班的男子,需要从被水淹没的城市中逃出生天。…

软件解压后怎么安装(手机解压软件app免费软件)

软件解压后怎么安装(手机解压软件app免费软件)

在PC端宅男、极客们会碰到需要解压缩文件的情况,这个时候大多会用到360压缩或者好压等第三方软件,然而到了移动手机端,由于自带的文件管理器大多不支持输入密码解压缩等复杂操作,让不少人对于手机解压缩文件失望,但是有时候电脑不在身边,又不得不在…

拉夏贝尔启示录:扩张只会“一地鸡毛”

拉夏贝尔启示录:扩张只会“一地鸡毛”

图源:摄图网 编者按:本文来自微信公众号蓝莓财经(ID:ITparty),作者:蓝莓君,创业邦经授权转载 11月22日晚间,拉夏贝尔发布关于被债权人申请破产清算的提示性公告。24日“拉夏贝尔被申请破产清算”登上热搜第一。 拉夏贝尔的跌落,从…

第二家东南亚美股上市公司诞生,Grab为何上市即大跌?

第二家东南亚美股上市公司诞生,Grab为何上市即大跌?

编者按:本文来自微信公众号美股研究社(ID:meigushe),创业邦经授权转载 在很长一段时间内,来自新加坡、发家于东南亚市场的Sea(冬海集团)都被外界称为造富神话。并非因为其“东南亚小腾讯”的影子,而是其强大的游戏和电商业务支撑它制霸…