2010-11-19 23 views
0

我试图在使用beginGradientFilldrawRect的Flash中绘制渐变,但是当绘制的矩形部分超出父区边界时,渐变根本不绘制。Flash:渐变填充在绘制到其父边界之外时消失?

例如,请考虑下面的代码:

function testGradient():void { 
    var g:Graphics = container.graphics; 
    var width:Number = container.width; 
    var height:Number = container.height; 
    var y:Number = 0; 
    var x:Number = 0; 
    var ratios:Array = [255 * y/height, 255 * (y + height)/height]; 
    g.beginGradientFill(GradientType.LINEAR, [0xFF, 0xFF], [0.6, 0], 
         ratios, null); 
    g.lineStyle(1, 0xFF0000); 
    g.drawRect(x, y, width, height); 
    g.endFill(); 
} 

当正在绘制的矩形container的范围内谎言,一切正常:

working gradient

但是,如果矩形超出了所容器的边界,渐变没有被绘制。例如,如果代码被改变为:

... 
var x:Number = 10; 
var y:Number = 10; 
... 

然后梯度消失:

broken gradient

短做吸取母体的范围内的框所需要的数学运算(和固定的渐变,所以它看起来是正确的),有什么办法来处理这个?

回答

1

我认为你的问题是你在你的比率计算中使用了x/y位置,并且这可能导致出界值。

使用比例计算,当x/y都为0,那么你会得到一个很好的平滑渐变:

ratios = [0,255]

然而,当你,例如,设置X/Y到10,你的比例数组变得

ratios = [25.5,280.5]

这是无效的。 ratios需要是从0到255的整数的线性系列。超出界限会导致变量被忽略。

要么硬编码您的ratios var如果您想为您保留一致梯度而不管其x/y位置如何,或者对比例数组中输入的值进行一些边界检查以确保它们在0-255之间。

请记住,在图形对象上调用drawRect时,x/y/width/height与您正在操作的对象的对象相关。

希望有帮助。