2008-11-27 2 views
2

У меня есть поверхность degrafa в контейнер для холста. Я хочу связать ширину и высоту. Когда я обвязку, как он работает, как ожидалось:Связывание с гибкими связями и AS3

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

Теперь кто-то сказал мне, что я должен делать это на validateSize() или updateDisplayList(), с моим текущим знанием сгибать я не действительно знаю почему, но я попробовал следующее:

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 может быть изменен, но не является «этим» контейнером для холста. Они, кажется, не привязаны, я что-то пропустил?

Также я хотел бы немного изменить отношение в rect.width = this.width с некоторым фактором в нем, который я не могу использовать с помощью метода bindproperty.

Большое спасибо за любую подсказку.

+0

Контейнер имеет нулевой размер при использовании второй случай. – coulix 2008-11-27 17:43:47

ответ

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; 

} 
1

Где-то в вашем updateDisplayList вы должны позвонить:

super.updateDisplayList(unscaledWidth, unscaledHeight); 
0

Метод updateDisplayList() где вы должны размер и положение ребенка вашего компонента объекты. Вы не должны устанавливать размер самого компонента (то есть: не выполнять: this.width=100).

Вы также можете сделать программный рисунок в updateDisplayList(), используя флэш-графику apis.

updateDisplayList() вызывается Flex и два параметра unscaledWidth и unscaledHeight - это размер, который будет отображаться вашим компонентом. Вы должны соблюдать эти измерения и задавать размер дочерних объектов вашего компонента на их основе.

При настройке размера в 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; 
}