2

キャンバス コンテナに degrafa サーフェスを作成しました。幅と高さの両方をリンクしたい。バインディングを使用すると、期待どおりに動作します:

// binding
   BindingUtils.bindProperty(rect,"height",this,"height"); 
   BindingUtils.bindProperty(rect,"width",this,"width"); 

さて、誰かがvalidateSize()またはupdateDisplayList()でそれを行うべきだと私に言いました.flexに関する私の現在の知識では、理由はよくわかりませんが、次のことを試しました

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

    trace(unscaledWidth, unscaledHeight);
    this.width = unscaledWidth;
    rect.width =unscaledWidth;
    this.height = unscaledHeight;
    rect.height = unscaledHeight;

}

degrafa の長方形は適切にサイズ変更されますが、「this」キャンバス コンテナーは変更されません。彼らは拘束されていないようです。

また、rect.width = this.width の関係を、bindproperty メソッドを使用して行うことができない何らかの要因で少し変更したいと思います。

手がかりをありがとう。

4

3 に答える 3

1

updateDisplayListのどこかで、次のように呼び出す必要があります。

super.updateDisplayList(unscaledWidth, unscaledHeight); 
于 2012-04-11T12:59:28.920 に答える
0

念のため、

いくつかのコード

public class RectangleShape extends BaseShape 
{
public function RectangleShape(fillColor:int) {
    super.name = shapeName;
    solidFill.color = fillColor;


    // shape
    solidFill.alpha = 0.3;
    rect.fill = solidFill;
    rect.stroke = solidStroke;    
    geoGroup.geometryCollection.addItem(rect);     
    geoGroup.target = surface;

    surface.graphicsCollection.addItem(geoGroup);  
    this.addChild(surface);

  // binding
  // BindingUtils.bindProperty(rect,"height",this,"height"); 
  // BindingUtils.bindProperty(rect,"width",this,"width"); 
}




 override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

    trace(unscaledWidth, unscaledHeight);
    this.width = unscaledWidth;
    rect.width =unscaledWidth;
    this.height = unscaledHeight;
    rect.height = unscaledHeight;

}
于 2008-11-27T19:49:50.290 に答える
0

updateDisplayList()メソッドは、コンポーネントの子オブジェクトのサイズと配置を行う場所です。コンポーネント自体のサイズを設定するべきではありません (つまり、しないでください: this.width=100)。

updateDisplayList()Flash グラフィック API を使用して、 でプログラムによる描画を行うこともできます。

updateDisplayList()Flex と 2 つのパラメーターによって呼び出されunscaledWidthunscaledHeightコンポーネントがレンダリングされるサイズです。これらの寸法を尊重し、それらに基づいてコンポーネントの子オブジェクトのサイズを設定する必要があります。

でサイズを設定するupdateDisplayList()場合、幅/高さのプロパティを直接変更することはありません。これを行うと、より多くの Flex ライフサイクル メソッドの実行がトリガーされます。代わりにsetActualSize()、子コンポーネントのメソッドを使用してください。

子オブジェクトの x/y プロパティを設定する場合も同じです。直接設定せず、move()メソッドを使用してください。

最後に、Flex 4 では、Spark コンポーネントにいくつかの類似のライフサイクル メソッドを追加しました。可能な場合はそれらを使用してください: setLayoutBoundsSize(), setLayoutBoundsPosition().

上記のように変更された元の は次のupdateDisplayList()とおりです。

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

    trace(unscaledWidth, unscaledHeight);

    // like Janroel said above, you should call the super class method
    // the only time you don't need to is when your component extends UIComponent
    // (because UIComponent's updateDisplayList doesn't do anything)
    super.updateDisplayList(unscaledWidth, unscaledHeight);

    // don't do this (your component will get sized by its parent)
    //this.width = unscaledWidth;
    // if 'rect' inherits from UIComponent you should use the setActualSize() method:
    rect.setActualSize(unscaledWidth, unscaledHeight);
    // if it doesn't inherit from UIComponent, do it the regular way...
    rect.width =unscaledWidth;
    //this.height = unscaledHeight;
    rect.height = unscaledHeight;
}
于 2012-04-11T15:47:37.830 に答える