【问题标题】:ActionScript 3 - adding gradient to objectActionScript 3 - 向对象添加渐变
【发布时间】:2014-01-22 15:40:58
【问题描述】:

我有一个名为“BlueBox”的影片剪辑实例,它只是一个蓝色的“绘图对象”。它在一个名为“option1MC”的容器内,该容器位于舞台上的“option1Container”内。它的颜色可以像这样更改:

option1Container.addEventListener(MouseEvent.MOUSE_OVER, option1ContainerOver);

var optionOver:ColorTransform = new ColorTransform();
optionOver.color = 0xC56516;

function option1ContainerOver(evt:Event):void {
    option1Container.option1MC.BlueBox.transform.colorTransform = optionOver;
}

我想将颜色更改为渐变。这是我尝试过的:

var mtr:Matrix = new Matrix();
mtr.createGradientBox(option1Container.option1MC.BlueBox.width, option1Container.option1MC.BlueBox.height, 0, 0, 0);
mtr.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); 
mtr.graphics.drawRect(0,0,option1Container.option1MC.BlueBox.width, option1Container.option1MC.BlueBox.height);

但是,现在当我运行 .fla 文件时,我给我一个错误提示:

Access of possible undefined property graphics through a reference with static type flasg.geom:Matrix:

指的是行

mtr.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); 
mtr.graphics.drawRect(0,0,option1Container.option1MC.BlueBox.width, option1Container.option1MC.BlueBox.height);

知道为什么吗?

【问题讨论】:

  • 因为Matrix 不是带有graphics 成员的DisplayObject

标签: actionscript-3 flash matrix gradient


【解决方案1】:

Matrix 没有 graphics 属性。您需要将此应用于具有graphics 属性的DisplayObject。使用您的设置看起来像这样:

//create the sprite to do the gradient fill on or use your MovieClip
//var spriteObject:Sprite = new Sprite() or just use option1Container;

//enter your matrix
var mtr:Matrix = new Matrix(); 
mtr.createGradientBox(option1Container.BlueBox.width, option1Container.BlueBox.height, 0, 0, 0);

//apply it to the sprite
sprite.graphics.beginGradientFill("linear", [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); 
sprite.graphics.drawRect(0, 0, 50, 40); 
sprite.graphics.endFill(); 
addChild(sprite);

我在这里创建了一个精灵变量,这不是必需的,因为您可以将spriteoption1Container 交换

您也可以参考 adobe 的帮助:http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7dd7.html

现在,如果您在 IDE 中绘制 MovieClip 图形,您目前将无法更改它。在这种情况下,您可以创建一个新的 MovieClip 并将其添加到您的容器中,如下所示:

//note I made a target variable just to save on typing:
var target:MovieClip = option1Container.option1MC.BlueBox;
var gradientLayer:MovieClip = new MovieClip();

var gradientBox:Matrix = new Matrix(); 
gradientBox.createGradientBox(target.width, target.height, 0, 0, 0); 
gradientLayer.graphics.beginGradientFill("linear", [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], gradientBox); 
gradientLayer.graphics.drawRect(0, 0, target.width, target.height); 
gradientLayer.graphics.endFill(); 

//giving the asset a name will allow you to easily remove it later
gradientLayer.name = "gradientLayer";

target.addChild(gradientLayer);

请注意,我将渐变资源命名为“gradientLayer”。如果你想稍后删除这个孩子,你可以这样做:

option1Container.option1MC.BlueBox.removeChild( option1Container.option1MC.BlueBox.getChildByName( "gradientLayer" ) );

【讨论】:

  • hm,option1Container 已经处于状态,所以我不需要 addChild(option1Container) 对吗?出于某种原因,当我执行 "option1Container.graphics.beginGradientFill("linear", [0xFF0000, 0x0000FF], [1, 1], [0x00, 0xFF], mtr); option1Container.graphics.drawRect(0, 0, 50 , 40); option1Container.graphics.endFill(); "它不会改变动画片段内蓝色框的颜色。我也试过做'option1Container.BlueBox.graphics',但这也没有改变它的颜色。知道为什么吗?
  • 如果没有实际查看您的设置,我不确定它为什么不起作用。当spriteObjectnew Sprite()new MovieClip(); 时,我提供的代码是正确的并且是一个工作示例,并且如果我将一个子项添加到精灵上并应用图形属性也可以正常工作。
  • hm,好吧假设舞台上有一个名为“option1Container”的影片剪辑,在里面有一个名为“option1MC”的影片剪辑,在里面有一个名为“BlueBox”的影片剪辑,它是一个具有圆角边缘的矩形实例,在 Flash 中绘制出来并转换为放置在库中的影片剪辑。要将 BlueBox 的颜色从蓝色更改,我会执行“option1Container.option1MC.BlueBox.transform.colorTransform = optionOver;” (假设 optionOver 是一种颜色变换).. 你知道如何将 BlueBox 的颜色从一种颜色更改为渐变吗?
  • 啊,我看到了这个问题,我会把它添加到我的答案中。
猜你喜欢
  • 2012-03-07
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多