Для приложения «рисование» ActionScript 3, я хочу иметь возможность выбрать текстуру и установить ее прозрачность. Поэтому я пытаюсь установить альфа-прозрачность текстуры. Но это не работает.as3 - настройка текстур альфа-значение
Что я делаю:
- На первый я использую graphics.linestyle(), чтобы установить линии толщины и ALPHA-значение.
- После этого я (a) загружаю png, (b) читаем его bitmapData и (c), затем используем его с помощью lineBitmapStyle.
Результат:
При рисовании линии (с MoveTo, LineTo, и т.д.) линии использовать текстуру, но ИГНОРИРУЙТЕ "Альфа", который был установлен с LineStyle.
Что я делаю неправильно?
myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, setTexture);
setTexture(e:Event):void
{
e.currentTarget.removeEventListener(e.type, arguments.callee);
//Try 1: Trying to set the Alpha-Trasparency with "lineStyle"-Command:
myDrawContainer.graphics.lineBitmapStyle(5, 0xFF0000, 0,6);
//Try 2: Trying to set the Alpha-Transparency by changing the Alpha-Value of the loaded content:
myLoader.content.alpha = 0.6;
//Getting the BitmapData of the Image:
BitmapDataOfMyTexture = Bitmap(LoaderInfo(e.target).content).bitmapData
//"Using" the TBitmapData as "Color/Texture" for my Drawing:
myDrawContainer.graphics.lineBitmapStyle(BitmapDataOfMyTexture);
//Test-Drawing:
myDrawContainer.graphics.moveTo(0, 0);
myDrawContainer.graphics.moveTo(500, 500); //-> RESULT: Textured Line WITHOUT Transparency!
}
РЕЗУЛЬТАТ: Я получаю строку, которая использует текстуру, но без прозрачности.
(Update) РЕШЕНИЕ: (Спасибо DodgerThud)
Для установки/изменения альфа-канал загруженного изображения, вы не используете "LineStyle", но ...
создать новый ColorTransform-объект
затем установите это «alphaMultiplier» к атрибуту по конкретному AlphaChannel
И затем применить этот вновь созданный colorTransform-Object для загруженного BitmapData, используя метод colorTransform для загруженных BitmapData.
НО:
Это не работает с изображениями, которые не имеют альфа-канал или не активировали их альфа-канал. Эти изображения получают только DARKER при опускании альфа-канала. В этих случаях вы должны сделать это:- Сначала я создать НОВЫЙ BitmapData-объект с «новым», установите его ширины и высоты к ширине и высоте загруженного изображения и установить его третий аргумент в TRUE (= прозрачность: ВКЛ.). Итак, вы получили «Контейнер», который имеет прозрачность ACTIVATED.
- Затем вы используете «copyPixels» в этом «Container» -Object, чтобы заполнить его пикселями LOADED BitmapData-Object.
- И сразу после этого вышеприведенный подход с «colorTransform» -Object приносит ожидаемый результат.
Так вот рабочий код:
myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, setTexture);
setTexture(e:Event):void
{
e.currentTarget.removeEventListener(e.type, arguments.callee);
//Getting the BitmapData of the Image:
BitmapDataOfMyTexture = Bitmap(LoaderInfo(e.target).content).bitmapData
//Create an ADDITIONAL BitmapData-Object with 3rd
//argument set to TRUE and with same width and height
//as the LOADED image:
var BMDContainerWithAlphaActivated:BitmapData;
BMDContainerWithAlphaActivated = new BitmapData(BitmapDataOfMyTexture.width, BitmapDataOfMyTexture.height, true, 0xFFFFFF);
//Copy the pixels of the loaded image into the newly created
//"BitmapData-Container with activated AlphaChannel":
BMDContainerWithAlphaActivated.copyPixels(BitmapDataOfMyTexture, new Rectangle(0, 0, BitmapDataOfMyTexture.width, BitmapDataOfMyTexture.height), new Point(0,0))
//Modify the Alpha-Value (of the NEW BitmapData-Object):
var colorChanges:ColorTransform = new ColorTransform();
colorChanges.alphaMultiplier = 0.3;
BMDContainerWithAlphaActivated.colorTransform(new Rectangle(0, 0, BitmapDataOfMyTexture.width, BitmapDataOfMyTexture.height), colorChanges);
//"Using" the (NEW) BitmapData as "Color/Texture" for my Drawing:
myDrawContainer.graphics.lineBitmapStyle(BMDContainerWithAlphaActivated);
//Test-Drawing:
myDrawContainer.graphics.moveTo(0, 0);
myDrawContainer.graphics.moveTo(500, 500); //-> RESULT: Textured Line WITH Transparency 0.3!
}
могли бы вы опубликовать фактическую (соответствующий) код, который помог бы нам помочь вы намного лучше, имо. – DodgerThud
Хорошо! Я отправлю код (см. Выше)! –
Хорошо, я думаю, проблема в следующем. Изменение альфа-значения 'myLoader.content' не изменит свойства' bitmapdata' загруженного png-файла. Вы просто изменяете внутреннее альфа-значение вспышки объекта. Поэтому, когда вы передаете содержимое загруженного файла, он по-прежнему имеет те же битмаддаты, что и раньше. Теперь у меня есть вопрос, почему бы просто не установить значение alpha myDrawContainer прямо на нужное значение, например 'myDrawContainer.alpha = 0.6'? – DodgerThud