【问题标题】:Android Canvas Clear with transparencyAndroid Canvas Clear 透明
【发布时间】:2014-03-18 20:40:09
【问题描述】:

我正在尝试从画布上“擦除”。就像清除画布的一个非常简单的测试一样,我实现了以下内容:

@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) 使屏幕完全变黑,而不是移除之前应用的调光。 The idea was taken from here

【问题讨论】:

  • 我很确定canvas.drawColor(0, Mode.CLEAR); 使屏幕完全变黑是预期的功能,所以不清楚你要求/试图完成什么 - 因为你正在完成它。如果您尝试做的只是暂时使视图变暗/对位图着色,然后删除变暗效果,那并不是真正“清除”画布。
  • 好吧,我试图完成的是设置一个自定义视图来覆盖一个活动,该自定义视图将用低 alpha 黑色填充屏幕以提供调光模式,然后我会想要在屏幕上某处没有调光模式的圆圈

标签: android android-canvas android-custom-view


【解决方案1】:

使用以下内容。

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

【讨论】:

  • 这已经是我代码中的内容了,因为 Color.TRANSPARENT 是 0 的常数。不过我已经找到了解决方案,谢谢。
  • 这个单行解决方案比接受的答案中的任何双 Canvas/Bitmap 废话要好得多。
  • 正如 Michael Herbig 所说,这应该是答案。使用位图将使用两倍的内存并导致另一个级别的缓冲!
  • 正如我在原始评论中所述,我的原始代码中已经有这一行(参见 OP),但是当时它对我不起作用,3 年后似乎这对我有更多帮助比我自己的人,所以我将其标记为正确答案
  • 这样做,我的画布变得全黑了
【解决方案2】:

解决方案是创建一个辅助画布和位图来绘制。我的自定义视图的 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);
}

onDrawMethod 看起来像

@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 在 onstructor 中声明为

transparentPaint = new Paint();
transparentPaint.setColor(getResources().getColor(android.R.color.transparent));
transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
transparentPaint.setAntiAlias(true);

【讨论】:

  • 很好的答案!你救了我!万分感谢! :))
【解决方案3】:

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

在您要覆盖的视图的构造函数中,将 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
}

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2013-03-13
    • 2011-11-18
    • 2012-01-31
    • 2016-05-06
    相关资源
    最近更新 更多