Android画布清晰透明

Android画布清晰透明,android,android-canvas,android-custom-view,Android,Android Canvas,Android Custom View,我试图从画布上“擦除”。作为清理画布的一个非常简单的测试,我实现了以下功能: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.argb(140, 0, 0, 0)); canvas.drawColor(0, Mode.CLEAR); } Color.argb(140,0,0,0)将绘制此视图的视图设置为暗显drawColor(0,M

我试图从画布上“擦除”。作为清理画布的一个非常简单的测试,我实现了以下功能:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.argb(140, 0, 0, 0));
    canvas.drawColor(0, Mode.CLEAR);
}

Color.argb(140,0,0,0)
将绘制此视图的视图设置为暗显
drawColor(0,Mode.CLEAR)
使屏幕完全变黑,而不是移除先前应用的调光

解决方案是创建辅助画布和位图进行绘制。我的自定义视图的onSizeChanged()方法如下所示

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    bitmap.eraseColor(Color.TRANSPARENT);
    temp = new Canvas(bitmap);
}
这个方法看起来像

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

    temp.drawColor(Color.argb(80, 0, 0, 0));
    temp.drawCircle(centerPosX, centerPosY, 200, transparentPaint);
    canvas.drawBitmap(bitmap, 0, 0, null);
}
其中transparentPaint在构造函数中声明为

transparentPaint = new Paint();
transparentPaint.setColor(getResources().getColor(android.R.color.transparent));
transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
transparentPaint.setAntiAlias(true);
使用以下命令

 canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);

您需要将整个视图设置为透明,否则,透明颜色将为黑色

在要覆盖的视图的构造函数中,将alpha设置为零

setAlpha(0); // this is the secret.
然后,在onDraw()方法中,可以清除视图:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // ...
    canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
    // do you painting here
}

我非常确定
canvas.drawColor(0,Mode.CLEAR)将屏幕完全变黑是预期的功能,因此并不清楚您要求/试图实现什么-因为您正在实现它。如果你想做的只是暂时调暗一个视图/一个位图,然后移除调暗效果,这并不是真正的“清除”画布。好吧,我想做的是设置一个自定义视图来覆盖一个活动,该自定义视图将用一个低阿尔法黑色填充屏幕以提供调暗模式,然后我想在屏幕上的某个地方画一个圆圈,这个圆圈没有我在代码中已经有的调光图案,因为Color.TRANSPARENT是0的常数。不过,我已经找到了一个解决方案,谢谢。这个单线解决方案比公认答案中的双画布/位图废话要好得多。正如Michael Herbig所说,这应该是答案。使用位图将使用两倍的内存,并导致另一级缓冲!正如我在最初的评论中所说的,我在最初的代码中已经有了这一行(见OP),但是它当时对我不起作用,3年后,它似乎帮助了比我自己更多的人,所以我将把这标记为正确的答案这样做,我的画布就变成了一个非常棒的答案!你救了我!非常感谢!:)