Для «приложения для рисования» Actionscript 3 я хочу иметь возможность выбрать текстуру и установить ее прозрачность. Поэтому я стараюсь установить альфа-прозрачность текстуры. Но это не работает.
Чем я занимаюсь:
- Сначала я использую graphics.linestyle (), чтобы установить толщину линий и АЛЬФА-значение.
- После этого я (а) загружаю png, (б) читаю его bitmapData и (в) затем использую его с 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!
}
РЕЗУЛЬТАТ: Я получаю линию, в которой используется текстура, но БЕЗ прозрачности.
(Обновление) РЕШЕНИЕ: (спасибо DodgerThud)
Для установки / изменения альфа-канала загруженного изображения вы не используете "lineStyle", но ...
Создайте НОВЫЙ объект colorTransform
Затем установите атрибут alphaMultiplier на конкретный alphaChannel.
А затем примените этот вновь созданный объект colorTransform к загруженным BitmapData, используя метод colorTransform загруженных BitmapData.
BUT :
- Сначала я создаю НОВЫЙ BitmapData-Object с «новым», устанавливаю его ширину и высоту равными ширине и высоте загруженного изображения и устанавливаю для него 3-й аргумент TRUE (= прозрачность: ON). Итак, у вас есть «Контейнер» с АКТИВИРОВАННОЙ прозрачностью.
- Затем вы используете «copyPixels» для этого «Контейнерного» -объекта, чтобы заполнить его пикселями ЗАГРУЖЕННОГО объекта BitmapData.
- И сразу после этого описанный выше подход с помощью объекта «colorTransform» приносит ожидаемый результат.
So HERE'S THE WORKING CODE:
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!
}
myLoader.content
не изменит свойстваbitmapdata
загруженного файла png. Вы просто меняете внутреннее альфа-значение вспышки объекта. Поэтому, когда вы передаете содержимое загруженного файла, он по-прежнему имеет те же растровые данные, что и раньше. Теперь у меня вопрос, почему бы просто не установить альфа-значение myDrawContainer непосредственно на нужное вам значение, напримерmyDrawContainer.alpha = 0.6
? - person   schedule 29.10.2014