Android Canvas清晰透明

rpe*_*yng 16 android android-custom-view android-canvas

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

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

Color.argb(140, 0, 0, 0)设置此视图被绘制的视图以使其变暗. drawColor(0, Mode.CLEAR)使屏幕完全变黑,而不是删除之前应用的调光. 这个想法来自这里

小智 21

使用以下内容.

 canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
Run Code Online (Sandbox Code Playgroud)

  • 这样做,我的画布变得完全黑了 (11认同)

rpe*_*yng 12

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

和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);
}
Run Code Online (Sandbox Code Playgroud)

其中transparentPaint在onstructor中声明为

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