0

int が配列にプッシュされるたびにグラフに値を表示するグラフ ドキュメントの基本コードを作成しようとしています。ここにコードがあります-

import flash.display.Shape;
import flash.display.MovieClip;
import flash.display.Sprite;
var myShape:Shape = new Shape();
myShape.graphics.lineStyle(2, 0x990000, 2);
var max:Number = 0;
var graph:Array = new Array();
var container:Sprite = new Sprite();
var redrawGraph = setInterval(reDraw,1000);
function reDraw()
    {
        while (container.numChildren)
        {
            container.removeChildAt(0);
        }
        graph.push(randomNum());
        graph.reverse();
        for (var ints in graph)
        {
        if (graph[ints] > max)
        {
            max = graph[ints];
        }
    }
for (var i:Number = 0; i < graph.length-1; i++)
{
    myShape.graphics.moveTo(550-i*50, (max – graph[i])*20);
    myShape.graphics.lineTo(550-(i+1)*50, (max – graph[i+1])*20);
    container.addChild(myShape);
}
this.addChild(container);
graph.reverse();
}

function randomNum():int
{

return Math.floor(Math.random() * 11);`

}

私が抱えている問題を除いて、グラフが前のグラフと重なってしまうことですが、古いグラフ形状を削除する必要がある部分が機能していないようです...そして理由がわかりません。

どんな助けでも大歓迎です。

(フォーマットについて申し訳ありません...正しく動作しません

4

3 に答える 3

1

表示オブジェクトの階層と表示オブジェクトのオブジェクトの操作の違いについて誤解がありgraphicsます。

を使用setIntervalしてコールバックを呼び出していreDrawます。

reDrawコールバックでは、とを使用しgraphics.moveTographics.lineToグラフを描画します。ただし、常に同じ「キャンバス」に描画しているすべてのフレーム、同じSpritemyShape

表示オブジェクトを相互に追加および削除する必要はありません。この場合、表示オブジェクトを追加する必要があるのは1回だけです。そして、更新するたびに、キャンバスをクリアして、描画を再開します。

たとえば、次のことを考慮してください。

    var myShape:Shape;
    var graph:Array;
    var container:Sprite = new Sprite();

    myShape = new Shape();
    graph = new Array();
    var redrawGraph:int = setInterval(reDraw,1000);

    container.addChild(myShape);
    this.addChild(container);

ここでは、シェイプを作成し、そのシェイプをコンテナーに配置してから、コンテナーをルート表示オブジェクトに追加しています。これでほぼ完了です。その後...

    private function reDraw():void {
        myShape.graphics.clear();
        myShape.graphics.lineStyle(2, 0x990000, 2);

        graph.unshift(randomNum());

        var i:uint, len:uint = graph.length, max:int = 0;

        for (i=0; i< len; i++) {
            max = Math.max(graph[i], max);
        }

        for (i = 0; i < len; i++)
        {
            myShape.graphics.moveTo(550-i*50, (max - graph[i])*20);
            myShape.graphics.lineTo(550-(i+1)*50, (max - graph[i+1])*20);

        }
    }

次に、ここで、表示ツリーに何も削除または追加していないことに注意してください。ツリーはすでに希望どおりに編成されています。再描画で行っているのは、形状をクリアしてから、表示したい方法で再描画することだけです。

表示階層を操作する必要がある場合もありますが、これはそのような場合ではありません。

実用的な例については、こちらをご覧ください...

于 2012-04-17T13:06:37.307 に答える
0

したがって、myShape オブジェクトの作成中に名前を追加すると、さらにこの myShapes を getChildByName メソッドを使用して削除すると便利です。

次のいくつかの変更を行います...

myShape の作成中...

var myShape:Shape = new Shape();
myShape.name = "myShape";
.
.
.
for (var i:Number = 0; i < graph.length-1; i++) 
{ 
    myShape.graphics.moveTo(550-i*50, (max – graph[i])*20); 
    myShape.graphics.lineTo(550-(i+1)*50, (max – graph[i+1])*20); 
    container.addChild(myShape); 
} 
this.addChild(container); 

抜きながら…

while(this.getChildByName("myShape")!= null){
    this.removeChild(this.getChildByName("myShape"));
}

これを試してみてください、これはうまくいくでしょう...

于 2012-04-17T05:56:27.257 に答える
0

このコードを確認してください...

このコードでは、UIcomponent にグラフィックを直接追加しましたが、これは正常に機能します...

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
                minWidth="955" minHeight="600" 
                creationComplete="application1_creationCompleteHandler(event)" >
    <mx:Script>
        <![CDATA[
            import flash.display.MovieClip;
            import flash.display.Shape;
            import flash.display.Sprite;

            import mx.core.UIComponent;
            import mx.events.FlexEvent; 


            private var _max:Number = 0; 
            private var _graph:Array = new Array(); 
            private var _container:UIComponent ;

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {

                _container = new UIComponent();
                this.addChild(_container);
                _container.graphics.lineStyle(2, 0x990000, 2);
                var redrawGraph = setInterval(reDraw,1000);
            }

            private function reDraw() 
            { 
                _graph.push(randomNum()); 
                _graph.reverse();
                _container.graphics.clear();
                _container.graphics.lineStyle(2, 0x990000, 2);
                for (var ints in _graph) 
                { 
                    if (_graph[ints] > _max) 
                    { 
                        _max = _graph[ints]; 
                    } 
                } 

                for (var i:Number = 0; i < _graph.length-1; i++) 
                { 
                    var a:Number = Number(_graph[i]);
                    var b:Number = Number(_graph[i+1]);
                    _container.graphics.moveTo(550-i*50,(_max-a) *20); 
                    _container.graphics.lineTo(550-(i+1)*50,( _max-b)*20);
                } 
                _graph.reverse(); 
            } 

            private function randomNum():int 
            { 
                return Math.floor(Math.random() * 11);
            } 
        ]]>
    </mx:Script>
</mx:Application>
于 2012-04-17T11:21:06.130 に答える