0

flash.display.Sprite を拡張し、低レベルの DisplayObject (Sprite'a、Shape's、TextField) の階層を利用する ActionScript 3 ビジュアライゼーションで複数のスクロール可能な領域を作成する最良の方法は何ですか?

メイン スプライトの子として追加された 3 つの mx.containers.Canvas オブジェクトを使用しようとしました。また、メイン スプライトをキャンバスに変換しようとしましたが、どちらの方法を使用しても何も表示されません。また、Canvas.addChild と Canvas.rawChildren.addChild の両方を使用して DisplayObject を追加しようとしました。

mx.* コンポーネントを使用するように全体を書き直す必要がありますか?それとも、Canvas オブジェクト内により多くのプリミティブ オブジェクトを表示するためのトリックがありますか?

スプライトを使用して動作する方法のサンプル コードを次に示します。_colSprite、_rowSprite、および _mapSprite をリンクされたスクロール バーでスロールさせたいと考えています。それらをCanvasオブジェクトに変換すると、表示オブジェクトが描画される前にコードが静かにハングします(正しく思い出せばaddChild行で)。

以下はコードの抜粋です。これはすべて、スプライトを拡張する単一のアクション スクリプト クラスからのものです。

スクロールしたい3つの領域を設定します:

this._log("Creating Sprites"); 

                this._colSprite = new Sprite();

                this._colSprite.y=0;

                this._colSprite.x=this._rowLabelWidth + this._rowLabelRightPadding + this._horizontalPadding;


this._rowSprite = new Sprite();

                this._rowSprite.y=this._columnLabelHeight+this._columnLabelBottomPadding + this._verticalPadding;

                this._rowSprite.x=this._horizontalPadding;




                this._mapSprite = new Sprite();

                this._mapSprite.y=this._columnLabelHeight+this._columnLabelBottomPadding+ this._verticalPadding;

                this._mapSprite.x=this._rowLabelWidth + this._rowLabelRightPadding+this._horizontalPadding;


                    this._log("adding kids"); 

addChild(this._mapSprite);

addChild(this._rowSprite);

addChild(this._colSprite);

サンプル描画機能:

 private function _drawColumLabels(colStartIndex: int): void {

        for (var col : int = colStartIndex; col < myData.g.length; col++) {

            var colName : String = this.myData.g[col].label;

            var bottomLeftPoint : Object = this._getCellXYTopLeft(0, col);

            bottomLeftPoint.y = this._columnLabelHeight + this._verticalPadding;

            var centerX : int = Math.round(this._cellWidth / 2 + (this._fontHeight / 2) - 1);



            var colLabel : TextField = new TextField();

                colLabel.defaultTextFormat = this._labelTextFormat;

                colLabel.width = this._columnLabelHeight+this._columnLabelBottomPadding;

                colLabel.text = colName;                

                colLabel.embedFonts = true;





                var colSprite : Sprite = new Sprite();

                colSprite.addChild(colLabel);

                colSprite.x = bottomLeftPoint.x;

                colSprite.y = bottomLeftPoint.y;



                colSprite.rotation = -45;



                this._colSprite.addChild(colSprite);



        }

    }
4

1 に答える 1

1

子を各 Canvas に追加した後、Canvas.invalidateSize() を (それぞれに対して) 呼び出して、サイズを再計算する必要がある場合があります。

これを行う必要があるのは、コンポーネント ライフサイクルのどの段階で子を追加するかによって異なります。つまり、'_drawColumLabels' を呼び出すときです。

表示領域に表示できるラベルよりも多くのラベルが含まれている場合、スクロールバーを _colSprite (および _rowSprite) に表示する必要があると思いますか? この場合、Sprite はスクロールをサポートしていないため、Canvas など、Sprite 以外のものを使用する必要があります。

また、各コンポーネントの x/y/width/height 値をデバッグして、期待どおりであることを確認することもできます。レイアウトを行う際に役立つのは、紙にレイアウトを描き、サイズと座標を書き始めることです。私の計算が正しいことがわかるように。

于 2008-10-02T18:29:54.410 に答える