Android 在我的半黑色画布上打一个透明的洞 我试图在屏幕中间创建一个带有透明孔的黑色屏幕。这是我试过的 @Override public void draw(Canvas canvas) { Paint myPaint = new Paint(); myPaint.setColor(0xC0000000); canvas.drawRect(mBlackRect, myPaint); myPaint = new Paint(); myPaint.setColor(Color.TRANSPARENT); myPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawRect(mTransparentRect, myPaint); }

Android 在我的半黑色画布上打一个透明的洞 我试图在屏幕中间创建一个带有透明孔的黑色屏幕。这是我试过的 @Override public void draw(Canvas canvas) { Paint myPaint = new Paint(); myPaint.setColor(0xC0000000); canvas.drawRect(mBlackRect, myPaint); myPaint = new Paint(); myPaint.setColor(Color.TRANSPARENT); myPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawRect(mTransparentRect, myPaint); },android,android-canvas,Android,Android Canvas,第二个油漆显示黑色而不是透明。如何在我的半黑色画布上打一个透明的洞?如果您没有保存画布,请尝试下面的代码 Paint myPaint = new Paint(); int sc = canvas.saveLayer(mBlackRect.left, mBlackRect.top, mBlackRect.right, mBlackRect.bottom, myPaint, Canvas.ALL_SAVE_FLAG); myPaint.

第二个油漆显示黑色而不是透明。如何在我的半黑色画布上打一个透明的洞?

如果您没有保存画布,请尝试下面的代码

Paint myPaint = new Paint();
    int sc = canvas.saveLayer(mBlackRect.left, mBlackRect.top,
            mBlackRect.right, mBlackRect.bottom, myPaint,
            Canvas.ALL_SAVE_FLAG);
    myPaint.setColor(0xC0000000);
    canvas.drawRect(mBlackRect, myPaint);

    myPaint.setColor(Color.TRANSPARENT);
    myPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawRect(mTransparentRect, myPaint);
    myPaint.setXfermode(null);
    canvas.restoreToCount(sc);
通过从已经绘制的对象中“移除像素”,您不能真正“打孔”,至少不能使用硬件层。如果使用软件层,则会对性能造成不利影响

你要做的是画你的形状与阿尔法遮罩应用到你的油漆。面具可以防止形状的某些部分被画在画布上,就像在展开绘画之前剪下一张纸并贴在墙上一样

要将alpha遮罩应用于绘制,首先需要创建包含“孔”形状的位图(通过编程或从资源中加载自定义图像),然后使用适当的Xfermode从此位图创建
BitmapShader
(取决于要剪切遮罩位图中的透明部分还是非透明部分),最后在绘制半透明矩形或任何所需内容之前,将此着色器应用于绘制

注意性能:仅创建一次绘制对象(不要在onDraw()中分配任何对象,因为此方法在UI线程上每秒最多调用60次),并且仅当视图/可绘制边界更改时才重新创建alpha掩码位图(当然,如果其尺寸取决于视图尺寸,否则只需创建一次)


很抱歉,如果我没有时间给您提供现成的代码,但我认为您应该找到关于我刚才描述的技术的大量信息,您可以自己开始试验并找出解决方案,我认为这更值得;)

来自Android文档:Canvas.saveLayer()“此方法非常昂贵,包含的内容的呈现成本是此方法的两倍以上。请避免使用此方法,尤其是在提供的边界较大的情况下。”"@BladeCoder这是因为您使用的是xfermode,您还可以在孔周围绘制4个不透明矩形。@rainash这显示了一个顶部带有红方块的黑屏。。。wtf@MuhammadUmar红色正方形?你的背景颜色是红色?在顶部?检查你的MTTransparentRect,我将颜色从半黑色更改为黑色,这样你就可以得到一个黑色屏幕,我已经编辑了a回答并运行代码,这样就行了