android - 自定义ViewGroup实现圆角边框效果外沿内容无法擦去?

 汤侑亦_473 发布于 2022-10-29 04:07

在对viewGroup实现圆角边框效果,我是我的代码:

public class NewViewGroup extends FrameLayout {
    public NewViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onLayout(boolean c, int l, int t, int r, int b) {
        super.onLayout(c, l, t, r, b);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        canvas.drawRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), 120, 120, paint);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}

测试了一下:


        

    

效果图:

出现问题,没办法把圆角外面的内容擦去,请问该怎么解决?

3 个回答
  • 为什么我在布局文件中看到的是剪切之后的效果。用手机跑起来就没有效果了

    2022-10-30 07:13 回答
  • 之前我想用PorterDuffXfermode做出圆角效果的,但是做不出来,现在用clipPath裁剪canvas来做。
    代码改为:

    @Override
        protected void dispatchDraw(Canvas canvas) {
            Path path = new Path();
            path.addRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), 60, 60, Path.Direction.CW);
            canvas.clipPath(path, Region.Op.REPLACE);
            super.dispatchDraw(canvas);
    
        }

    效果截图:

    可以了。在问题中,PorterDuff.Mode.DST_IN不是显示下层相交部分吗,不明白为什么外沿也会出来?

    2022-10-30 07:14 回答
  • 看看这篇文章图像合成Xfermode和任意形状ImageView

    关键原因是

    这是因为直接通过Canvas#drawXX方法画图时, SRC仅是图形内的像素, 例如你画了一个圆, 那么SRC(即将要画的像素)仅是圆内的像素, 也就是说图片与圆不重叠的像素并不会有任何变化, 当然就不会消失了.

    2022-10-30 07:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有