Android Canvas清晰透明

问题描述 投票:14回答:3

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

@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

android android-canvas android-custom-view
3个回答
20
投票

使用以下内容。

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

10
投票

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

其中透明Paint在构造函数中声明为

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

0
投票

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

在您要覆盖的视图的构造函数中,将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
}
© www.soinside.com 2019 - 2024. All rights reserved.