android 实现一个或多个角为圆角图片

android 实现一个或多个角为圆角图片

不废话先上图 :

这里写图片描述

实现思路:

  1. 先绘制一个圆角矩形,不知道的朋友可以去看下这篇文章
    参考文章: 完美实现图片圆角和圆形(鸿洋)
  2. 哪些角不需要绘制圆角,将其补全。
  3. 将需要设置成圆角图片的源图片和新绘制的圆角矩形进行合并(通过PorterDuff.mode)

实现过程

因为懒得自定义,也为了避免太多渗透(前者是关键),用的是生成圆角bitmap对象的方式。如果有需要的朋友可以参考思路自定义View。

  • 生成圆角Bitmap对象
public class ImageUtils  {

    public static final int CORNER_TOP_LEFT = 1;
    public static final int CORNER_TOP_RIGHT = 1 << 1;
    public static final int CORNER_BOTTOM_LEFT = 1 << 2;
    public static final int CORNER_BOTTOM_RIGHT = 1 << 3;
    public static final int CORNER_ALL = CORNER_TOP_LEFT | CORNER_TOP_RIGHT | CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;


    /**
     * 把图片某固定角变成圆角
     *
     * @param bitmap 需要修改的图片
     * @param pixels 圆角的弧度
     * @param corners 需要显示圆弧的位置
     * @return 圆角图片
     */
    public static Bitmap toRoundCorner(Bitmap bitmap, int pixels, int corners) {
        //创建一个等大的画布
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        final int color = 0xff424242;
        final Paint paint = new Paint();
        //获取一个跟图片相同大小的矩形
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        //生成包含坐标的矩形对象
        final RectF rectF = new RectF(rect);
        //圆角的半径
        final float roundPx = pixels;

        paint.setAntiAlias(true); //去锯齿
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        //绘制圆角矩形
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        //异或将需要变为圆角的位置的二进制变为0
        int notRoundedCorners = corners ^ CORNER_ALL;

        //哪个角不是圆角我再把你用矩形画出来
        if ((notRoundedCorners & CORNER_TOP_LEFT) != 0) {
            canvas.drawRect(0, 0, roundPx, roundPx, paint);
        }
        if ((notRoundedCorners & CORNER_TOP_RIGHT) != 0) {
            canvas.drawRect(rectF.right - roundPx, 0, rectF.right, roundPx, paint);
        }
        if ((notRoundedCorners & CORNER_BOTTOM_LEFT) != 0) {
            canvas.drawRect(0, rectF.bottom - roundPx, roundPx, rectF.bottom, paint);
        }
        if ((notRoundedCorners & CORNER_BOTTOM_RIGHT) != 0) {
            canvas.drawRect(rectF.right - roundPx, rectF.bottom - roundPx, rectF.right, rectF.bottom, paint);
        }
        //通过SRC_IN的模式取源图片和圆角矩形重叠部分
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        //绘制成Bitmap对象
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }
} 

注意: 这里关于PorterDuff可以参考这个图,一共16种效果,大家可以一一尝试。先绘制的是黄色的图,后绘制的蓝色的图。

这里写图片描述

  • 布局文件

    <ImageView
        android:id="@+id/iv_Test"
        android:layout_width="200dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        android:scaleType="centerCrop"
         />
  • 使用
 /**
     * 设置数据
     */
    private void setData() {
        Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        Bitmap disBitmap = ImageUtils.toRoundCorner(srcBitmap, DensityUtil.dipToPx(this, 20), ImageUtils.CORNER_TOP_LEFT|ImageUtils.CORNER_BOTTOM_RIGHT  );
        mIvTest.setImageBitmap(disBitmap);
        srcBitmap.recycle();

    }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值