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

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

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

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、他是个手无缚鸡之力的白面书生。…

直播间里“拆盲盒”,二手电商平台「Whatnot」拆出15亿美元丨快鲤鱼海外

直播间里“拆盲盒”,二手电商平台「Whatnot」拆出15亿美元丨快鲤鱼海外

靠着直播带货和“拆盲盒”,二手潮品电商平台 Whatnot 在今年已经完成了3轮融资,公司估值达到 15 亿美元,成立2年便跻身独角兽之列。 通过商品认证转卖、直播拍卖、直播间开“盲盒”等看似有点“中国味”的玩儿法,Whatnot一改美国二…

区块链开发技术有前景吗(区块链技术开发费用)

由于人们对大数据、区块链、人工智能行业的认识越来越深入,企业可以通过大数据、区块链、人工智能等思维和技术寻求变革。传统行业依靠原有产业优势“后来居上”,低调布局区块链技术,传统产业企业和科技企业同时进入产业区块链赛道。在区块链发展报告中,我…

个人云存储哪个品牌好(云存储十大品牌排行榜)

个人云存储哪个品牌好(云存储十大品牌排行榜)

最近越来越多的视频博主开始在安利“私有云”存储,很多人觉得听起来偏硬核,平时也用不上,就没有过多去了解。可能是“云”这个概念容易让人觉得门槛很高,其实私有云没有大家想象中那么复杂,它的用法也可以很简单,并且能给我们的移动生活带来很多便利。…

静物拍摄怎样拍出高级感(静物拍照的技巧和角度)

静物拍摄怎样拍出高级感(静物拍照的技巧和角度)

静物摄影其实不如大家想象的一般轻巧,日常所见的普通物什和菜肴,要拍出静谧质感,不落俗套,反而更为困难。 不过,有了今天宇哥为大家推荐的美食静物摄影LR预设, 普普通通的原片也能变成物哀美学大作!镜头不能表现其可口百分之一的佳肴也能鲜亮诱人!…

ajax请求步骤详细代码(前端ajax请求的五个步骤)

ajax请求步骤详细代码(前端ajax请求的五个步骤)

由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问。 比如说你的网站域名是aaa.com,想要通过AJAX请求bbb.com域名中的内容,浏览器就…