【问题标题】:PorterDuff.Mode.DST_IN getting black where should be transparentPorterDuff.Mode.DST_IN 在应该透明的地方变黑
【发布时间】:2014-10-29 23:19:14
【问题描述】:

图像透明的地方,我变黑了……

我在位图画布上用另一个图像遮罩了一个图像,它工作得很好,但是当我尝试在自定义视图的 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);

【问题讨论】:

    标签: android canvas view transparency


    【解决方案1】:

    您可能需要在视图的初始化中开启软件渲染:

    setLayerType(LAYER_TYPE_SOFTWARE, null);
    

    很多 Android 绘图命令在使用默认设置的硬件渲染时会静默失败或产生不正确的结果。

    【讨论】:

    • 这很糟糕,考虑到它可能会明显变慢,尤其是在处理动画时。
    • @ollien 同意,在硬币的另一面,让 API 失败并且在默认设置下什么都不做似乎很疯狂。
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2011-12-27
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多