PorterDuff.Mode.DST_IN 应该透明的地方变黑

Bad*_*ano 2 transparency android canvas view

图像是透明的,我会变黑......

我已经做了同样的事情,用位图画布上的另一个图像遮盖图像,它工作得很好,但是当我尝试在自定义视图的 onDraw 内部遮盖时,它不起作用。

我尝试了一切,在图像蒙版、路径、其他图像之前绘制矩形,所有东西都在应该透明的地方保持黑色。我搜索了人们在使用 CLEAR 模式时遇到的许多其他问题,但没有成功。

请帮忙!

    mBGPaint = new Paint();
    mBGPaint.setStyle(Paint.Style.FILL);
    mBGPaint.setColor(Color.TRANSPARENT);

    mRectSrc = new Rect();
    mRectDst = new Rect();

    mask = BitmapFactory.decodeResource(getResources(), R.drawable.big_balloon_path);
    maskPaint = new Paint();
    maskPaint.setFilterBitmap(true);
    maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

    mRectSrc.set(0, 0, mask.getWidth(),mask.getHeight() );
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    mRectDst.set(0,0,this.getMeasuredWidth(),this.getMeasuredHeight());
}

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

    canvas.drawRect(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight(), mBGPaint);
    canvas.drawBitmap(mask, mRectSrc, mRectDst, maskPaint);
Run Code Online (Sandbox Code Playgroud)

pen*_*s90 5

您可能需要在视图初始化时打开软件渲染:

setLayerType(LAYER_TYPE_SOFTWARE, null);
Run Code Online (Sandbox Code Playgroud)

当使用硬件渲染(这是默认设置)时,许多 Android 绘图命令会默默失败或产生不正确的结果。

  • 考虑到它可能会明显变慢,尤其是在处理动画时,这很糟糕。 (2认同)