PorterDuffXfermode

通过PorterDuffXfermode设置圆角/圆形图片:

效果图:

    /**
     * 圆或圆角图片
     * @param bitmap
     * @param drawcircle 是否绘制圆
     * @return
     */
    public Bitmap  toRoundBitmap(Bitmap bitmap,boolean drawcircle) {
        int width =  bitmap.getWidth();// 获取图片的宽度
        int height =  bitmap.getHeight();// 获取图片的高度
        int  squareWidth = Math.min(width, height);
        // 正方形的边长,以宽和高中最小的那个为参照,截取正方形
        Bitmap backgroundBmp = Bitmap.createBitmap(squareWidth,squareWidth,Config.ARGB_8888);// 构建一个正方形的bitmap
        // 创建一个画布,用于画图
        Canvas canvas = new Canvas(backgroundBmp);
        // 创建一个画笔
        Paint paint = new Paint();
        paint.setAntiAlias(true); // 设置边缘光滑,去掉锯齿
        //取正中间的部分、正方形的左上右下坐标
        Rect src = new  Rect(width/2-squareWidth/2,height/2-squareWidth/2, width/2+squareWidth/2,  height/2+squareWidth/2);
        //目标图片的大小
        RectF dest = new  RectF(0,0, squareWidth, squareWidth);  
        if(drawcircle){
            canvas.drawCircle(squareWidth/2,  squareWidth/2, squareWidth/2, paint);//画一个圆
        }else{
            canvas.drawRoundRect(dest, 100,100, paint); //画圆角
        }
        // 设置当两个图形相交时的模式,SRC_IN为取图形相交的部分,多余的将被去掉
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, src, dest,  paint); // canvas将bitmap画在backgroundBmp上     
        return  backgroundBmp; // 返回已经绘画好的backgroundBmp
    }

PorterDuffXfermode:
效果图(来自ApiDemos/Graphics/XferModes)

PorterDuff.Mode为枚举类,一共有16个枚举值:

1.PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。

2.PorterDuff.Mode.SRC
显示上层绘制图片

3.PorterDuff.Mode.DST
显示下层绘制图片

4.PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖。

5.PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示。

6.PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。

7.PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。

8.PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。

9.PorterDuff.Mode.DST_OUT
取下层绘制非交集部分。

10.PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分

11.PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分

12.PorterDuff.Mode.XOR
异或:去除两图层交集部分

13.PorterDuff.Mode.DARKEN
取两图层全部区域,交集部分颜色加深

14.PorterDuff.Mode.LIGHTEN
取两图层全部,点亮交集部分颜色

15.PorterDuff.Mode.MULTIPLY
取两图层交集部分叠加后颜色

16.PorterDuff.Mode.SCREEN
取两图层全部区域,交集部分变为透明色

canvas原有的图片可以理解为背景,就是dst;新画上去的图片可以理解为前景,就是src

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值