gpt4 book ai didi

android - 如何为透明覆盖创建 mask ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:20 26 4
gpt4 key购买 nike

我有以下场景:一个位图用作背景,另一个位图用作覆盖层,可以是 50% 透明或不透明(在运行时可更改),第三个位图包含第二个掩码位图。我尝试了不同的 Xfermodes 配置和绘图顺序,但未能找到合适的。

我将掩码用作位图,因为我需要能够在程序的两次运行之间或配置更改之间保存它。它是在用户在屏幕上绘制时创建的,有效地清除了 war 迷雾

来自最佳尝试的代码 fragment 。唯一没有像我希望的那样起作用的是我的面具的透明度。

@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mFogOfWar, mTransformationMatrix, mPaintFog);
canvas.drawBitmap(mMaskBitmap, mTransformationMatrix, mPaintMask);
canvas.drawBitmap(mImage, mTransformationMatrix, mPaintImage);
}

绘制对象:

mPaintImage.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
mPaintFog.setAlpha(127);
mPaintMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

这是我通过当前配置得到的更清晰的结果: screenshot

我不确定我是否能够在 Paint 对象上设置 alpha;如果不是,我不介意针对 alpha 问题的其他建议或解决方案,最好是不需要重新创建用作 war 迷雾的位图的建议或解决方案。

编辑:

通过执行以下操作,我能够获得我想要的结果:

@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mImage, mTransformationMatrix, mPaintImage);
if (mMaskBitmap != null) {
canvas.drawBitmap(mFogOfWar, mTransformationMatrix, mPaintFog);
canvas.drawBitmap(mMaskBitmap, mTransformationMatrix, mPaintMask);
canvas.drawBitmap(mMaskBitmap, mTransformationMatrix, mPaintImage);
canvas.drawBitmap(mImage, mTransformationMatrix, mPaintImageSecondPass);
}

绘制对象:

mPaintImage = new Paint(); // No Xfermode here anymore
mPaintFog.setAlpha(127);
mPaintMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mPaintImageSecondPass.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN));

但是绘制位图五次似乎是一种浪费。由于 Android 硬件加速,它在 OpenGL 纹理中运行(我将位图重新调整为设备 GPU 可接受的最高分辨率)并且我在我的 invalidates() 中非常小心它运行出奇的流畅在我的 Nexus S 和我的 A500 上,但我不确定其他设备(无论如何项目都将是 4.0+)。

但我相信一定有更好的方法来做到这一点。我想要一种避免 overdraw 太多的方法,或者至少可以向我正确解释那些 Xfermodes 的含义并且我没有 overdraw 东西。

最佳答案

在顿悟之后,我尝试了一种完全不同的方法 - 并意识到这个问题的解决方案是一种更简单的方法 - 通常是这样。因为我只需要两个位图,所以我需要更少的内存来处理它。

绘图:

canvas.drawBitmap(mImage, mTransformationMatrix, mPaintImageRegular);
if (mFogOfWarState != FOG_OF_WAR_HIDDEN) {
canvas.drawBitmap(mFogOfWar, mTransformationMatrix, mPaintFog);
}

“ secret ”是,我不是在蒙版位图上绘制,而是使用另一种绘制来删除 war 迷雾:

mFogOfWarCanvas.drawPath(mPath, mEraserPaint);

唯一具有XfermodePaint 是用于删除的:

mEraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

为了加载和保存我的面具,我执行以下操作:

private void createFogAndMask(File dataDir) {
BitmapDrawable tile = (BitmapDrawable) getResources().getDrawable(R.drawable.fog_of_war);
tile.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
mFogOfWar = Bitmap.createBitmap(mImageBounds.width(), mImageBounds.height(), Config.ARGB_8888);
mFogOfWarCanvas = new Canvas(mFogOfWar);
tile.setBounds(mImageBounds);
tile.draw(mFogOfWarCanvas);
tile = null;

// Try to load an existing mask
File existingMask = new File(dataDir, getMaskFileName());
if (existingMask.exists()) {
Bitmap existingMaskBitmap = BitmapFactory.decodeFile(existingMask.getAbsolutePath());
mFogOfWarCanvas.drawBitmap(existingMaskBitmap, new Matrix(), mPaintImageRegular);
mFogOfWarCanvas.drawPaint(mMaskEraserPaint);
existingMaskBitmap.recycle();
System.gc();
}
}

public void saveMask(File folder) throws IOException {
if (!mReady || mImagePath == null) return;
mImage.recycle();
System.gc();
if (!folder.exists()) {
folder.mkdirs();
}
File savedFile = new File(folder, getMaskFileName());

// Change all transparent pixels to black and all non-transparent pixels to transparent
final int length = mImageBounds.width() * mImageBounds.height();
final int[] pixels = new int[length];
mFogOfWar.getPixels(pixels, 0, mImageBounds.width(), 0, 0, mImageBounds.width(), mImageBounds.height());
for (int i = 0; i < length; i++) {
if (pixels[i] == Color.TRANSPARENT) {
pixels[i] = Color.BLACK;
} else {
pixels[i] = Color.TRANSPARENT;
}
}
mFogOfWar.setPixels(pixels, 0, mImageBounds.width(), 0, 0, mImageBounds.width(), mImageBounds.height());

FileOutputStream output = new FileOutputStream(savedFile);
mFogOfWar.compress(CompressFormat.PNG, 80, output);
output.flush();
output.close();
}

关于android - 如何为透明覆盖创建 mask ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305405/

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