Гибкая обвязка и AS3 - PullRequest
       9

Гибкая обвязка и AS3

2 голосов
/ 27 ноября 2008

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

// 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;

}

Размер прямоугольника Деграфа хорошо изменяется, но не контейнер "this". Кажется, они не связаны, я что-то пропустил?

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

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

Ответы [ 3 ]

1 голос
/ 11 апреля 2012

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

super.updateDisplayList(unscaledWidth, unscaledHeight); 
0 голосов
/ 11 апреля 2012

Метод 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;
}
0 голосов
/ 27 ноября 2008

На всякий случай,

еще немного кода

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;

}
...