canvas.drawBitmap() распознает альфа-слой только тогда, когда он равен 0

#android #alpha

#Android #альфа

Вопрос:

Я загружаю ресурсы png с помощью BitmapFactory.decodeResource , а затем рисую их на Canvas с помощью drawBitmap() .

Я рисую разные слои по одному, чтобы прозрачные объекты закрывали то, что им положено, но когда у меня в png-файлах альфа-уровни выше 0, они, похоже, игнорируются. Места, где альфа равна 0, не отображаются, что является правильным, но там, где альфа меньше 255, вместо смешивания цвета с существующим цветом в этом пикселе, он просто рисует его без какого-либо альфа-смешивания вообще.

Как я могу нарисовать растровое изображение на Canvas с правильным смешиванием на основе альфа-канала исходных изображений? Далее следуют соответствующие фрагменты кода:

 BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Config.ARGB_8888;
...
decorationTextures[1] = new 
    TextureStatic(BitmapFactory.decodeResource(resources, R.drawable.ice_1, opt));
decorationTextures[2] = new 
    TextureStatic(BitmapFactory.decodeResource(resources, R.drawable.ice_2, opt));
...
if(mTexture != null amp;amp; mInPlay) {
    if(mZone != null)
        canvas.drawBitmap(mTexture.getBitmap(),
                          mScreenX   mZone.getXOffset(), 
                          mScreenY   mZone.getYOffset(), null);
    else
        canvas.drawBitmap(mTexture.getBitmap(), mScreenX, mScreenY, null);
}
  

Комментарии:

1. Вы нашли решение этой проблемы?

Ответ №1:

Вы пробовали изменять формат вашего SurfaceView (если вы его используете) и / или вашего Window , чтобы он соответствовал формату ( ARGB_8888 ) используемого вами растрового изображения? Это может помешать вам получить настоящие эффекты прозрачности, и в любом случае вам следует попытаться согласовать форматы вашего окна / растрового изображения для повышения производительности / качества.

Попробуйте Window.setFormat(PixelFormat.RGBA_8888); и SurfaceHolder.setFormat(PixelFormat.RGBA_8888; установить формат пикселей.