3

私はまだ Flash IDE 環境に慣れていないので、FlashDevelop で純粋なコードを書いています。さまざまなグラフィック アセットのスプライトを入手しましたが、そのうちの 1 つは、非常に便利な scale9Grid 機能で使用することを目的としていました...うまくいきませんでした。人生で初めてだったので、何かを台無しにしたと思いましたが、drawRoundRect と beginFill (beginBitmapFill ではなく) を試したところ、期待どおりに動作しました。私の論理的な考えは、ビットマップでは機能しないということでした(Adobe Livedocsの例では、オランウータンの写真を使用してscale9Grid機能を示しているにもかかわらず)。

その後、「うまく動く」から「動かない、Adobe を台無しにする」まで、さまざまな意見を読みました。だから私は今興味があります、それは機能しますか、それとも機能しませんか?

Embedステートメントでscale9Gridパラメーターを指定する方法を見つけましたが、埋め込み画像はスプライトです。とにかくそれではうまくいかないと思いますよね?

4

4 に答える 4

9

[Embed] タグを掘り下げてそのアプローチを分析した後、サイズ変更のたびにビットマップを山積みしたり、グラフィックを再描画したりせずに scale9Grid を実行する方法を見つけました。

scale9Grid は、描画 API グラフィックス (またはグラフィックス オブジェクト) にのみ影響し、ビットマップには直接影響しません。そのため、シェイプまたはスプライトのグラフィックス オブジェクトにビットマップを描画する必要があります。

shape.graphics.beginBitmapFill(bitmapData);

秘訣は、スライスごとに個別の塗りつぶしを行うことですが、これは最初の 1 回だけです。

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 に答える