gpt4 book ai didi

Android:着色器在 'onDraw(canvas)' 和 'new Canvas(bitmap)' 中表现不同

转载 作者:太空狗 更新时间:2023-10-29 12:57:08 29 4
gpt4 key购买 nike

我在尝试创建反射阴影时发现了一个问题。

请在我的自定义 View 中找到以下代码:

@Override
protected void onDraw(Canvas canvas) {
//prepare
canvas.drawColor(Color.GRAY);
Bitmap source = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

//First Column
canvas.drawBitmap(source, 0, 0, new Paint());

//2nd Column
canvas.drawBitmap(source, source.getWidth(), 0, new Paint());

//Reflection
Matrix matrix = new Matrix();
matrix.preScale(1.0f, -1.0f);
matrix.postTranslate(source.getWidth(), source.getHeight()*2);
canvas.drawBitmap(source, matrix, new Paint());

Paint paint2 = new Paint();
LinearGradient shader = new LinearGradient(
source.getWidth()*3/2,
source.getHeight(),
source.getWidth()*3/2,
source.getHeight()*2,
0x7FFFFFFF, 0x00FFFFFF, TileMode.CLAMP);
paint2.setShader(shader);
paint2.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.DST_IN));
canvas.drawRect(
source.getWidth(),
source.getHeight(),
source.getWidth()*2,
source.getHeight()*2,
paint2);

//3rd Column
Bitmap bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight()*2, Config.ARGB_8888);
Canvas canvas2 = new Canvas(bitmap);
canvas2.drawBitmap(source, 0, 0, new Paint());
matrix = new Matrix();
matrix.preScale(1.0f, -1.0f);
matrix.postTranslate(0, source.getHeight()*2);
canvas2.drawBitmap(source, matrix, new Paint());


paint2 = new Paint();
shader = new LinearGradient(
source.getWidth()*1/2,
source.getHeight(),
source.getWidth()*1/2,
source.getHeight()*2,
0x7FFFFFFF, 0x00FFFFFF, TileMode.CLAMP);
paint2.setShader(shader);
paint2.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.DST_IN));
canvas2.drawRect(
0,
source.getHeight(),
source.getWidth(),
source.getHeight()*2,
paint2);

canvas.drawBitmap(bitmap, source.getWidth()*2,0, new Paint());
}

我在 Canvas (我从 onDraw(canvas) 获得)和 canvas2(使用 new Canvas(bitmap) 创建)中做同样的事情

但是,两者绘制不同的shader效果如下: different shader effect

为什么着色器效果不同?

最佳答案

考虑第二列中的黑色矩形:

PorterDuff.MODE.DST_IN 定义为 [Sa*Da, Sa*Dc]。由于目标像素是恒定的不透明灰色 (Da=1),因此结果的 alpha channel 将设置为线性渐变的 alpha channel ,范围从 0.5 到 1。

您的问题就在那里...在第二列中,您将 Window Canvas 的像素设置为部分透明。从下面透出什么?窗口背景,仍然是默认的黑色。

在第 3 列中,您首先绘制到屏幕外位图,然后将部分透明的屏幕外位图绘制到 Window Canvas 。这是可行的,因为传入像素(来自屏幕外位图)不会完全替换已经存在的像素,而是与目标缓冲区混合(在 PorterDuff 术语中,我认为它等同于 SRC_ATOP)。

关于Android:着色器在 'onDraw(canvas)' 和 'new Canvas(bitmap)' 中表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231260/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com