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

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

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

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

分享给朋友:

相关文章

手机拍视频软件哪个好用(新手拍好人像摄影技巧)

手机拍视频软件哪个好用(新手拍好人像摄影技巧)

每一个热爱生活的人都关注了“手机摄影技巧”…

没想到,理想汽车成了“蔚小理”中最有钱的公司

没想到,理想汽车成了“蔚小理”中最有钱的公司

图源:摄图网 编者按:本文来自微信公众号连线出行(ID:lianxianchuxing),作者:周雄飞,创业邦经授权转载 曾几何时,理想汽车还是“蔚小理”三兄弟之中最落魄的一家。 理想汽车于2015年7月由李想创立,虽然与蔚来、小鹏相比起步…

飞行汽车是一种应用层创新

飞行汽车是一种应用层创新

编者按:本文来自A轮财经,创业邦经授权发布。 作者|WX 今天在全球范围内,飞行汽车得到了越来越多的关注。 据摩根士丹利研报预计,2030年飞行汽车行业将形成3000亿美元的市场规模。2040年,该行业规模可能将达到1.5万亿美元。 作为新…

gta5画面设置1060最新(gta5超低配流畅设置)

gta5画面设置1060最新(gta5超低配流畅设置)

《GTA5》这款游戏需要的配置要求并不高,而且优化非常好,不需要太高的配置就可以高画质流畅运行,而配置比较低的话就需要一些调整画质减轻模糊程度的方法了,首先是把画质全部调最高,更多如下。 gta5怎么调画质 首先要画质好先把全部调最高,然…

windows系统还原点怎么用(电脑设置还原点的方法)

windows系统还原点怎么用(电脑设置还原点的方法)

设置系统还原点可以恢复我们在Win10计算机中所需的状态,并确保系统继续使用而无需重新加载。但对于系统还原,许多小伙伙伴不知道如何设置还原点,并且特定步骤与每个人共享。 Win10计算机设置恢复点 1.右键单击桌面上此计算机,右键单击菜单…

信息技术服务管理体系证书(信息认证咨询满足四大条件)

IT服务提供商通过实施IT服务管理体系,可以获取如下收益: 保持服务目标与企业业务目标一致,有效的支持业务战略 建立规范的服务流程,提高信息技术服务和运营效率 有效及高效地整合和利用信息、基础架构、应用及人员等IT资源 建立持续改进的服务管…