我正在尝试创建一个动画壁纸。
基本上我的壁纸有一些背景图片和一些前景图片。我想在不同背景的前景图片之间切换。
我有一个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
}