如何使canvas.drawBitmap透明



我正在尝试创建一个动画壁纸。

基本上我的壁纸有一些背景图片和一些前景图片。我想在不同背景的前景图片之间切换。

我有一个Draw方法,看起来像这样:

 protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        canvas.drawColor(0);
        canvas.drawBitmap(background,0,0,null);
        canvas.drawBitmap(foreground,x,y,null);
        canvas.save();
}

我的前景图片是一个有很多透明空间的png。

我在前景图片中加载了这样的内容:

 foreground=decodeSampledBitmapFromResource(getResources(), R.drawable.c1, 440,320);

decodeSampledBitmapFromResource方法取自此处的教程:https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

我的问题是,前景将显示白色,而它应该显示透明的颜色,从而用一个丑陋的白色矩形覆盖背景。

我想知道是否有人能给我什么建议,让这件事变得透明。我已尝试设置选项。inPreferredConfig=Bitmap.Config.ARGB_8888;为BitmapFactory,但它没有帮助。

Paint paint = new Paint();
paint.setAlpha(70); // you can change number to change the transparency level
Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.someDrawable);
canvas.drawBitmap(image, x, y, paint); 

您需要使用Paint并将混合模式设置为SRC_OVER

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
    canvas.drawColor(0);
    canvas.drawBitmap(background,srcRect,dstRect,paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
    canvas.drawBitmap(foreground,srcRect2,dstRect2,paint);
    canvas.save();
}

请参阅PorterDuff.Mode了解各种混合选项(有很多…)

使用SRC_ATOP这会将透明图像置于背景图像之上。

fun overlay(bmp1: Bitmap, bmp2: Bitmap): Bitmap {
    val bmOverlay = Bitmap.createBitmap(bmp1.width, bmp1.height, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bmOverlay)
    val paint = Paint()
    canvas.drawBitmap(bmp1, 0f, 0f, paint)
    paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)
    canvas.drawBitmap(bmp2, 0f, 0f, paint)
    return bmOverlay
}

最新更新