3

我还没有习惯Flash IDE环境,所以我在FlashDevelop中编写纯代码。我得到了各种图形资产的精灵,其中一个是用来与非常有用的 scale9Grid 功能一起使用的……它没有用。因为我是第一次这样做,我以为我搞砸了,但后来我尝试了 drawRoundRect 和 beginFill(而不是 beginBitmapFill),它按预期工作。我的逻辑想法是它不适用于位图(尽管在 Adob​​e Livedocs 示例中,他们使用猩猩的图片来展示 scale9Grid 功能)。

在那之后,我阅读了各种各样的意见,从“它工作得很好”开始,到“它不工作,去你的 Adob​​e”结束。所以我现在很好奇,它有效还是无效?

我找到了如何在 Embed 语句中指定 scale9Grid 参数,但我的嵌入图像是精灵。我想它无论如何都不会工作,对吧?

4

4 回答 4

9

在深入研究 [Embed] 标签并分析它的方法后,我想出了如何在每次调整大小时不用一堆位图或重新绘制图形的情况下进行 scale9Grid。

scale9Grid 仅影响绘图 API 图形(或 Graphics 对象) - 不直接影响位图。因此,您必须将位图绘制到 Shape 或 Sprite 的图形对象:

shape.graphics.beginBitmapFill(bitmapData);

诀窍是为每个切片做一个单独的填充,但只是第一次:

var rect:Rectangle = new Rectangle(20, 20, 60, 10);
var gridX:Array = [rect.left, rect.right, bitmapData.width];
var gridY:Array = [rect.top, rect.bottom, bitmapData.height];

shape.graphics.clear();

var left:Number = 0;
for (var i:int = 0; i < 3; i++) {
    var top:Number = 0;
    for (var j:int = 0; j < 3; j++) {
        shape.graphics.beginBitmapFill(bitmapData);
        shape.graphics.drawRect(left, top, gridX[i] - left, gridY[j] - top);
        shape.graphics.endFill();
        top = gridY[j];
    }
    left = gridX[i];
}
shape.scale9Grid = rect;

记得做一个 endFill() 否则它不会工作。准备好形状后,您只需添加 scale9Grid Rectangle 即可完成所有设置 - 完美的位图缩放,无需额外的显示对象或不断重绘。

于 2011-06-27T15:37:24.237 回答
2

在找到这篇文章之前,我把头撞到了刻度网格上。比例网格有很多限制,如果不满足,则不会应用。如果您无法解决它们,这里是 9 位图方法:ScaleObject

于 2010-12-10T13:31:32.147 回答
1

除非您拆分位图,否则位图将无法与 scale9Grid 一起使用。您还可以使用自定义类来完成为您拆分位图的工作。

http://www.dreaminginflash.com/2007/12/03/9-slice-and-bitmap/

更新:

关于理解缩放。看看这张图片。如果需要,将缩放红色部分。

替代文字

于 2010-12-10T12:10:13.197 回答
1

不错的片段,泰勒赖特

一些优化:

static public function drawAndScale9Grid(s : Shape, bitmapData : BitmapData, rect : Rectangle) : void {
    const gridX : Vector.<Number> = Vector.<Number>([rect.left, rect.right, bitmapData.width]);
    const gridY : Vector.<Number> = Vector.<Number>([rect.top, rect.bottom, bitmapData.height]);

    const g : Graphics = s.graphics;
        g.clear();

    var left : Number = 0;
    var i : int, j : int;
    const n : uint = gridX.length, m : uint = gridY.length;
    while(i < n) {  
        j = 0; // reset j
        var top : Number = 0;
        while(j < m) {
            // draw shape with special coords of bitmapdata
            g.beginBitmapFill(bitmapData);
            g.drawRect(left, top, gridX[i] - left, gridY[j] - top);
            g.endFill();

            top = gridY[j];

            j++;
        }
        left = gridX[i];

        i++;
    }
    s.scale9Grid = rect;
}
于 2012-10-24T10:38:36.463 回答