Рисование полупрозрачных битовых массивов с помощью Холста (Android)

Я имею Растровый объект и хочу представить его к объекту Холста с переменными уровнями полупрозрачности (т.е. заставить целый битовый массив частично пережить). Например, у меня есть спрайты в игре (которые оттянуты поверх растрового фона), что я хочу исчезнуть из того, чтобы быть непрозрачным к тому, чтобы быть невидимым. Я могу сделать это, не имея необходимость обращаться к OpenGL?

8
задан wordyword 17 March 2010 в 23:10
поделиться

2 ответа

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

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

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

Чтобы затушить изображение, вам нужно будет многократно закрашивать его с некоторой подходящей задержкой (но управляемой событиями от таймера, а не в цикле, если только система рендеринга 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-битный цвет), то при рисовании любых изображений в базовой графической системе может просто игнорироваться альфа-канал). Но любой композитинг, выполненный вами до этого на изображении из бэк-буфера, должен быть соблюден. Суть в том, что вы можете вынуждены использовать рисование с двойным буферизацией, чтобы делать альфа-смешивание и при этом не зависеть от возможностей/конфигурации базового устройства.

-1
ответ дан 5 December 2019 в 15:22
поделиться

Вы должны быть в состоянии определить анимацию tween и применить эту анимацию к 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, когда она будет готова:

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);

Пробовали ли вы какие-либо из этих вариантов?

12
ответ дан 5 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: