У меня есть следующий сценарий: растровое изображение, которое используется в качестве фона, и другое растровое изображение, которое используется в качестве наложения, которое может быть прозрачным на 50% или непрозрачным (изменяемым во время выполнения), и третье растровое изображение, которое содержит маску для этой секунды.Битовая карта.Я пробовал разные конфигурации Xfermodes и порядок рисования, но не смог найти правильный.
Я использую маску в качестве растрового изображения, потому что мне нужно сохранить ее между двумя запускамипрограмма или между изменениями конфигурации.Он создается, когда пользователь рисует на экране, эффективно убирая туман войны .
из лучшего фрагмента кода.Единственная вещь, которая не работала так, как мне хотелось, это прозрачность моей маски.
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mFogOfWar, mTransformationMatrix, mPaintFog);
canvas.drawBitmap(mMaskBitmap, mTransformationMatrix, mPaintMask);
canvas.drawBitmap(mImage, mTransformationMatrix, mPaintImage);
}
Paint
объекты:
mPaintImage.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
mPaintFog.setAlpha(127);
mPaintMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
Это то, что я получаю с текущейКонфигурация должна быть более понятной: ![screenshot](https://i.stack.imgur.com/peulp.jpg)
Я не уверен, смогу ли я выполнить эту настройку альфа на объекте Paint;если нет, то я не возражаю против другого предложения или решения проблемы альфа, предпочтительно такого, где воссоздание растрового изображения, используемого в качестве тумана войны , не требуется.
РЕДАКТИРОВАТЬ:
Я смог получить желаемые результаты, выполнив следующие действия:
@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);
}
Paint
Объекты:
mPaintImage = new Paint(); // No Xfermode here anymore
mPaintFog.setAlpha(127);
mPaintMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mPaintImageSecondPass.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN));
Норисование растровых изображений пять раз кажется пустой тратой.Поскольку это работает в текстуре OpenGL из-за аппаратного ускорения Android (я масштабирую растровые изображения в самое высокое разрешение, принимаемое графическим процессором устройства), и я очень осторожно отношусь к своему invalidates()
, он работает на мой Nexus S и мой на удивление гладкоA500, но я не уверен насчет других устройств (в любом случае проект будет 4.0+).
Но я убежден, что должен быть лучший способ сделать это.Я бы хотел, чтобы этот способ избежал слишком большого перерасхода или, по крайней мере, мог бы правильно объяснить мне, что означают эти Xfermodes и что я не перезаписываю вещи.