Рисование полупрозрачных растровых изображений с помощью Canvas (Android) - PullRequest
8 голосов
/ 18 марта 2010

У меня есть объект Bitmap, и я хочу отобразить его в объект Canvas с различными уровнями прозрачности (то есть сделать весь рисунок частично видимым). Например, у меня в игре есть спрайты (которые нарисованы поверх растрового фона), от которых я хочу избавиться от непрозрачности до невидимости. Могу ли я сделать это, не прибегая к OpenGL?

Ответы [ 2 ]

12 голосов
/ 31 мая 2010

Вы должны быть в состоянии определить анимацию анимации и применить эту анимацию к imageView. Ресурс XML будет похож на следующий (с именем fade_animation.xml):

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/linear_interpolator"
   android:fromAlpha="1.0"
   android:toAlpha="0.0"
   android:duration="100" />

тогда вы будете загружать и применять эту анимацию к вашему пользовательскому изображению, когда будете готовы:

ImageView sprite = (ImageView) findViewById(R.id.sprite);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_animation);
sprite.startAnimation(animation);

Есть и другие варианты. Если вы используете растровые изображения и не хотите делать анимацию, вы можете вручную уменьшить альфа-значение каждого кадра, примерно так:

paint.setAlpha(100);
canvas.drawBitmap(spriteImage, left, top, paint);

Вы пробовали какой-либо из этих вариантов?

0 голосов
/ 20 марта 2010

Просматривая документацию для Android (которая выглядит на основе JSE с полностью альтернативным графическим интерфейсом), вы получите изображение поддержки альфа-канала:

Bitmap bmp=createBitmap(100,100,Bitmap.Config.ARGB_8888);

Пока растровое изображение source поддерживает альфа-канал, вы сможете рисовать его на другом растровом изображении и учитывать его значения альфа.

Чтобы затемнить, вам нужно будет многократно рисовать изображение с некоторой подходящей задержкой (но событие, управляемое таймером, а не в цикле, если система рендеринга Android сильно отличается от других Javas), манипулируя альфа-каналом для каждого пиксель на каждой последующей краске.

// Make image more transparent by 50%
int[] pxls=new int[100*100];
bmp.getPixels(pxls,0,100,0,0,100,100);
for(int xa=0,len=pxl.length; xa<len; xa++) {
    int alp=(pxls[xa] & 0xFF000000);
    alp<<1;
    pxls[xa]=(alp | (pxls[xa] & 0x00FFFFFF);
    }
bmp.setPixels(pxls,0,100,0,0,100,100);

Предупреждение 1: Я написал этот код на месте из JavaDoc; он не был скомпилирован или протестирован.

Предупреждение 2: Если цветовое разрешение аппаратного устройства не поддерживает альфа-канал (обычно известный как 32-битный цвет), рисование любых изображений в базовой графической системе может просто игнорировать альфа-канал ). Но любой композитинг, который вы делаете до этого на резервном буфере изображения, должен соблюдаться. Суть в том, что вы можете иметь , чтобы использовать рисование с двойной буферизацией для альфа-смешивания, в то же время будучи невосприимчивым к возможностям / конфигурации основного устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...