在填充的Android画布上绘制一个透明圆圈

 我爱你2602912303 发布于 2023-02-10 13:38

在此输入图像描述

我想做一些非常简单的事情(见上文).我希望画布的所有像素都是纯色,但填充中心圆的像素除外.我已经阅读了关于这个主题的数百个堆栈溢出帖子,并尝试了数百种事情,包括设置PorterDuff.Mode.这是我当前onDraw()的MyView扩展视图:

  protected void onDraw(Canvas canvas) {
    int w = canvas.getWidth();
    int h = canvas.getHeight();

    Paint framePaint = new Paint();
    framePaint.setStyle(Paint.Style.FILL);
    framePaint.setColor(Color.BLUE);
    canvas.drawRect(0, 0, w, h, framePaint);

    Paint transparentPaint = new Paint();
    transparentPaint.setColor(Color.TRANSPARENT);
    transparentPaint.setAntiAlias(true);
    canvas.drawCircle(w / 2, h / 2, (w + h) / 4, transparentPaint);
  }

我误解了什么,为什么我不能用透明涂料涂在现有的像素上.当我这样做时,像素保持不变.当我使用PorterDuff时,像素变黑.请帮忙.

1 个回答
  • 试试这个:

    public class TransparentCircle extends View {
    
        Bitmap bm;
        Canvas cv;
        Paint eraser;
    
        public TransparentCircle(Context context) {
            super(context);
            Init();
        }
    
        public TransparentCircle(Context context, AttributeSet attrs) {
            super(context, attrs);
            Init();
        }
    
        public TransparentCircle(Context context, AttributeSet attrs,
                                 int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            Init();
        }
    
        private void Init(){
    
            eraser = new Paint();
            eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
            eraser.setAntiAlias(true);
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    
            if (w != oldw || h != oldh) {
                bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
                cv = new Canvas(bm);
            }
            super.onSizeChanged(w, h, oldw, oldh);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
    
            int w = getWidth();
            int h = getHeight();
            int radius = w > h ? h / 2 : w / 2;
    
            bm.eraseColor(Color.TRANSPARENT);
            cv.drawColor(Color.BLUE);
            cv.drawCircle(w / 2, h / 2, radius, eraser);
            canvas.drawBitmap(bm, 0, 0, null);
            super.onDraw(canvas);
        }
    }
    

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