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

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

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

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图片圆角内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

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

分享给朋友:

相关文章

富人定律:假装自己很有钱的做法,很多时候是必须的

富人定律:假装自己很有钱的做法,很多时候是必须的

1、几年前,我去朋友公司上班,去之前,他给我联系好了住宿——一个离公司特别远的小隔间,两个人合住,每月200多块钱的住宿费。我知道,他是为我好,那正是我缺钱的时候,他觉得我应该尽可能地省钱,就找了这间全城最便宜的住处。但这个小隔间,真的有很…

免费的包子,好心做了好事却害了自己

免费的包子,好心做了好事却害了自己

中午与老板一块吃饭,听到了一个老好人事件。就是一包子铺老板许坤免费送人包子事件!这是个真实的事件,现在网上有流传,下边的内容来源于某个平台,大家一起来看看吧。…

自动回复的经典句子,这11句值得收藏

自动回复的经典句子,这11句值得收藏

1、什么风把您吹来了,是timi赢了么。…

养成良好的习惯,做一名有品位的教师

养成良好的习惯,做一名有品位的教师

陶行知先生说:“思想决定行动,行动养成习惯,习惯形成品质,品质决定命运”。最近从网上读了《影响教师一生的100个好习惯》一书,不禁对陶先生这句话有了更深刻的领悟和理解。阅读本书带给我的不仅是享受,更多的则是生活的引领,智慧的传递和方法的教授…

联想乐pad平板电脑有哪些版本(平板电脑排行榜性价比)

联想乐pad平板电脑有哪些版本(平板电脑排行榜性价比)

对于安卓平板电脑行业而言,创新相对来说比较困难。一方面,安卓系统的功能早已经被各方挖掘殆尽;另一方面,从整个平板电脑行业大环境来看,iPad阵营坚固的护城河也影响着安卓阵营的创新欲望。再加上时下热衷于投身平板电脑行业的品牌本来就不像以往那么…

融资丨「大湾生物」完成近千万美元A轮融资,比邻星创投及高瓴创投共同领投

融资丨「大湾生物」完成近千万美元A轮融资,比邻星创投及高瓴创投共同领投

创业邦获悉,近日,大湾生物有限公司(以下简称:大湾生物)宣布完成近千万美元A轮融资,由比邻星创投与高瓴创投共同领投,阿隆资本跟投以及阿里巴巴香港创业者基金等现有投资者追加投资。本轮融资将加快大湾生物全球创新的三大人工智能平台,分别是智能化细…