Маскирование экранных объектов

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Экранный объект можно применить в качестве маски, чтобы создать отверстие, сквозь которое видно содержимое другого экранного объекта.

Определение маски

Чтобы указать, что экранный объект будет маской для другого экранного объекта, сделайте маскирующий объект свойством mask маскируемого экранного объекта:

// Make the object maskSprite be a mask for the object mySprite. 
mySprite.mask = maskSprite;

Маскированный экранный объект находится под всеми непрозрачными областями экранного объекта, выполняющего роль маски. Например, следующий код создает экземпляр Shape, содержащий квадрат размером 100х100 пикселов, и экземпляр Sprite, содержащий синий круг с радиусом 25 пикселов. При нажатии на круг он задается в качестве маски для квадрата так, что видна лишь та часть квадрата, которая закрыта сплошной частью круга. Иными словами, виден будет только красный круг.

// This code assumes it's being run within a display object container 
// such as a MovieClip or Sprite instance. 
 
import flash.display.Shape; 
 
// Draw a square and add it to the display list. 
var square:Shape = new Shape(); 
square.graphics.lineStyle(1, 0x000000); 
square.graphics.beginFill(0xff0000); 
square.graphics.drawRect(0, 0, 100, 100); 
square.graphics.endFill(); 
this.addChild(square); 
 
// Draw a circle and add it to the display list. 
var circle:Sprite = new Sprite(); 
circle.graphics.lineStyle(1, 0x000000); 
circle.graphics.beginFill(0x0000ff); 
circle.graphics.drawCircle(25, 25, 25); 
circle.graphics.endFill(); 
this.addChild(circle); 
 
function maskSquare(event:MouseEvent):void 
{ 
    square.mask = circle; 
    circle.removeEventListener(MouseEvent.CLICK, maskSquare); 
} 
 
circle.addEventListener(MouseEvent.CLICK, maskSquare);

Экранный объект, выступающий в роли маски, можно перетаскивать и анимировать, а также динамически изменять его размер. Внутри одной маски могут использоваться отдельные фигуры. Маскирующий экранный объект не обязательно добавлять в список отображения. Однако если требуется, чтобы масштаб маскирующего объекта изменялся при изменении масштаба рабочей области, или если необходимо включить возможность взаимодействия пользователя с маской (например, управляемое пользователем перетаскивание и изменение размера), маскирующий объект необходимо добавить в список отображения. Фактический z-индекс (порядок расположения слоев) экранных объектов не играет никакой роли, если маскирующий объект добавлен в список отображения. Маскирующий объект будет появляться на экране только в виде маски. Если маскирующий объект является экземпляром MovieClip с несколькими кадрами, он воспроизводит все кадры на временной шкале. То же самое происходит и тогда, когда он не выступает в роли маски. Удалить маску можно, присвоив свойству mask значение null:

// remove the mask from mySprite 
mySprite.mask = null;

Маску нельзя применять для маскирования другой маски. Невозможно задать свойство alpha маскирующего экранного объекта. В экранном объекте, выбранного в качестве маски, используются только заливки; обводки игнорируются.

AIR 2

Если экранный маскируемый объект кэшируется путем установки свойств cacheAsBitmap и cacheAsBitmapMatrix, маска должна быть дочерней по отношению к этому объекту. Аналогичным образом, если маскируемый экранный объект является потомком контейнера экранных объектов, которые кэшируются, маска и экранный объект должны быть потомками этого контейнера. Если маскируемый объект является потомком контейнера нескольких кэшированных экранных объектов, маска должна быть потомком кэшированного контейнера, ближайшего к маскируемому объекту в списке отображения.

О маскировании шрифтов устройства

Экранный объект можно использовать в целях маскирования текста, набранного шрифтом устройства. Когда экранный объект используется для маскирования текста, набранного шрифтом устройства, прямоугольное ограничивающее поле маски используется в качестве маскирующей фигуры. Иными словами, если в среде разработчика создать непрямоугольную маску экранного объекта для текста со шрифтом устройства, то маска в SWF-файле приобретает форму прямоугольной ограничительной рамки маски, а не форму самой маски.

Маскирование альфа-канала

Маскирование альфа-канала поддерживается, если и маска, и маскированные экранные объекты используют кэширование растровых изображений, как показано ниже.

// maskShape is a Shape instance which includes a gradient fill. 
mySprite.cacheAsBitmap = true; 
maskShape.cacheAsBitmap = true; 
mySprite.mask = maskShape;

Например, маскирование альфа-канала можно применять для применения фильтра к маскирующему объекту независимо от фильтра, который применен к маскированному экранному объекту.

В следующем примере в рабочую область загружен внешний файл с изображением. Это изображение (точнее говоря, экземпляр Loader, в который оно загружено) становится маскированным экранным объектом. Овал с градиентом (центр, окрашенный сплошным черным цветом, который переходит к прозрачному по краям) нарисован поверх изображения; это маска альфа-канала. У обоих экранных объектов отключено кэширование растровых изображений. Овал задан в качестве маски для изображения, и это придает ему способность к перетаскиванию.

// This code assumes it's being run within a display object container 
// such as a MovieClip or Sprite instance. 
 
import flash.display.GradientType; 
import flash.display.Loader; 
import flash.display.Sprite; 
import flash.geom.Matrix; 
import flash.net.URLRequest; 
 
// Load an image and add it to the display list. 
var loader:Loader = new Loader(); 
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); 
loader.load(url); 
this.addChild(loader); 
 
// Create a Sprite. 
var oval:Sprite = new Sprite(); 
// Draw a gradient oval. 
var colors:Array = [0x000000, 0x000000]; 
var alphas:Array = [1, 0]; 
var ratios:Array = [0, 255]; 
var matrix:Matrix = new Matrix(); 
matrix.createGradientBox(200, 100, 0, -100, -50); 
oval.graphics.beginGradientFill(GradientType.RADIAL, 
                                colors, 
                                alphas, 
                                ratios, 
                                matrix); 
oval.graphics.drawEllipse(-100, -50, 200, 100); 
oval.graphics.endFill(); 
// add the Sprite to the display list 
this.addChild(oval); 
 
// Set cacheAsBitmap = true for both display objects. 
loader.cacheAsBitmap = true; 
oval.cacheAsBitmap = true; 
// Set the oval as the mask for the loader (and its child, the loaded image) 
loader.mask = oval; 
 
// Make the oval draggable. 
oval.startDrag(true);