следующая программа создает фон, состоящий из 2 слоев - растеризованной заливки и повторяющейся растровой заливки с режимом смешивания Multiply сверху. при щелчке окно переключается между полноэкранным режимом и режимом окна, соответствующим образом корректирует размер фона и затемнеет от черного с помощью Tweener.
когда я запускаю программу напрямую с помощью автономного проигрывателя Flash Player (10.2), анимация постепенного исчезновения очень плавная как в полноэкранном, так и в оконном режиме. но когда я запускаю приложение как приложение AIR (2.5), анимация затухания заметно отстает, становится прерывистой.
Я разработал приложение, используя Flash Professional CS5. Я пробовал публиковать со всеми 3 вариантами аппаратного ускорения (нет, Direct, GPU), но нет никакой разницы. я считаю, что код оптимизирован настолько, насколько это возможно, для анимации экранных объектов путем преобразования их в растровые изображения.
Я запускаю код как в автономном Flash Player 10.2, так и в AIR 2.6 (хотя приложение опубликовано для 2.5 SDK) в Mac OS X 10.6.7 с 27-дюймовым iMac @ 3,06 ГГц Intel Core 2 Duo и 4 ГБ оперативной памяти. У меня нет доступа к тестированию в Windows или Linux.
ниже - это основной класс документа, прикрепленный во встроенном .png, который я использовал ("Background.png") в коде.
package
{
//Imports
import com.caurina.transitions.Equations;
import com.caurina.transitions.Tweener;
import flash.display.Bitmap;
import flash.display.BlendMode;
import flash.display.BitmapData;
import flash.display.PixelSnapping;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.filters.BlurFilter;
import flash.geom.Matrix;
//SWF Metadata Tag
[SWF (width = "1000", height = "500", frameRate = "60", backgroundColor = "0x000000")]
//Class
public class FullScreenFadeTest extends Sprite
{
//Constants
private static const MIN_WINDOW_WIDTH:uint = 480;
private static const MIN_WINDOW_HEIGHT:uint = 320;
private static const BLUR_AMOUNT:uint = 150;
//Variables
[Embed (source = "Background.png")]
private var ImageAsset:Class;
private var backgroundFillShape:Shape;
private var backgroundFillBitmap:Bitmap;
private var backgroundFillBitmapData:BitmapData;
private var backgroundTexture:Shape;
private var canvas:Sprite;
private var faderShape:Shape;
private var faderBitmap:Bitmap;
private var faderBitmapData:BitmapData;
private var fader:Sprite;
//Constructor
public function FullScreenFadeTest()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
init();
}
//Initialize
private function init():void
{
backgroundFillShape = new Shape();
backgroundFillShape.graphics.beginFill(0x7F7F7F, 1.0);
backgroundFillShape.graphics.drawRect(-(MIN_WINDOW_WIDTH + BLUR_AMOUNT * 2) / 2, -(MIN_WINDOW_HEIGHT + BLUR_AMOUNT * 2) / 2, MIN_WINDOW_WIDTH + BLUR_AMOUNT * 2, MIN_WINDOW_HEIGHT + BLUR_AMOUNT * 2);
backgroundFillShape.graphics.endFill();
backgroundFillShape.graphics.beginFill(0xFFFFFF, 1.0);
backgroundFillShape.graphics.drawEllipse(-MIN_WINDOW_WIDTH * 0.75 / 2, -MIN_WINDOW_HEIGHT * 0.5 / 2, MIN_WINDOW_WIDTH * 0.75, MIN_WINDOW_HEIGHT * 0.5);
backgroundFillShape.graphics.endFill();
backgroundFillShape.filters = [new BlurFilter(BLUR_AMOUNT, BLUR_AMOUNT, 3)];
backgroundFillBitmapData = new BitmapData(MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT);
backgroundFillBitmapData.draw(backgroundFillShape, new Matrix(1, 0, 0, 1, MIN_WINDOW_WIDTH / 2, MIN_WINDOW_HEIGHT / 2));
backgroundFillBitmap = new Bitmap(backgroundFillBitmapData, PixelSnapping.NEVER, true);
backgroundFillBitmap.width = stage.stageWidth;
backgroundFillBitmap.height = stage.stageHeight;
backgroundTexture = new Shape();
backgroundTexture.graphics.beginBitmapFill(backgroundFillBitmapData = (new ImageAsset()).bitmapData);
backgroundTexture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
backgroundTexture.graphics.endFill();
backgroundTexture.blendMode = BlendMode.MULTIPLY;
canvas = new Sprite();
canvas.addChild(backgroundFillBitmap);
canvas.addChild(backgroundTexture);
faderShape = new Shape();
faderShape.graphics.beginFill(0x000000, 1.0);
faderShape.graphics.drawRect(0, 0, 1, 1);
faderShape.graphics.endFill();
faderBitmapData = new BitmapData(1, 1);
faderBitmapData.draw(faderShape);
faderBitmap = new Bitmap(faderBitmapData, PixelSnapping.NEVER);
faderBitmap.width = stage.stageWidth;
faderBitmap.height = stage.stageHeight;
fader = new Sprite();
fader.addChild(faderBitmap);
fader.alpha = 0.0;
addChild(canvas);
addChild(fader);
stage.addEventListener(MouseEvent.CLICK, toggleDisplayState);
}
//Toggle Display State
private function toggleDisplayState(evt:MouseEvent):void
{
if (!Tweener.isTweening(fader))
{
if (stage.displayState == StageDisplayState.NORMAL)
stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
else
stage.displayState = StageDisplayState.NORMAL;
backgroundTexture.graphics.clear();
backgroundTexture.graphics.beginBitmapFill(backgroundFillBitmapData);
backgroundTexture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
backgroundTexture.graphics.endFill();
backgroundFillBitmap.width = fader.width = stage.stageWidth;
backgroundFillBitmap.height = fader.height = stage.stageHeight;
fader.alpha = 1.0;
Tweener.addTween(fader, {time: 1.0, delay: 1.0, transition: Equations.easeInOutCubic, alpha: 0.0});
}
}
}
}
![Background](https://i.stack.imgur.com/rzxXh.png)