Flex 4 жизненный цикл и рисование материала вручную - PullRequest
0 голосов
/ 26 июля 2010

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

Когда вызывается метод 'function set dataSource', я делаю следующее (упрощенно):

        var newLine:Line = new Line();     
        newLine.stroke = new SolidColorStroke();
        newLine.xFrom = 0;
        newLine.yFrom = 0;
        newLine.xTo = 0;
        newLine.yTo = height;
        this.addElement(newLine);

Линия не растягивается до самого низа родителя.Я предполагаю, что испортил жизненный цикл, но мне не кажется, что гибкий жизненный цикл особенно легко понять, поэтому я не уверен, как это сделать.

Ответы [ 3 ]

1 голос
/ 27 июля 2010

Если вы не хотите взаимодействовать со строкой как объектом в списке отображения, я просто нарисовал бы ее в updateDisplayList(), используя Graphics api , и вызвал бы invalidateDisplayList() из set dataSource()

"правильный" способ немного более многословен; -)

private var dataSourceValid = true;

public function set dataSource(value:FooData):void {
    _dataSource = foo;
    dataSourceValid = false;
    invalidateProperties();
}

override protected function commitProperties():void {

    if (!dataSourceValid)
        commitDataSource();

    // Do it later in case we've invalidated something 
    // belonging to Flex while validating our stuff
    super.commitProperties();
}

protected function commitDataSource():void {

    // Do whatever we need to with our datasource, 
    // including adding or removing child elements.

    // ...

    // If we also need to re-draw something, then
    // invalidateDisplayList();

    dataSourceValid = true;
}

(весь код набран в TextMate, поэтому он, вероятно, полон орфографических ошибок и не компилируется, ноВы поняли)

0 голосов
/ 29 июля 2010

Не совсем понятно, что вы хотите сделать, но, добавив свойство dataSource к Group, вы увидите, как будто вы пытаетесь заново изобрести DataGroup.Возможно, вам следует рассмотреть возможность использования последнего вместо пользовательского ItemRenderer, внутри которого вы можете нарисовать линию?

0 голосов
/ 26 июля 2010

Я согласен с вами, это, вероятно, связано с тем, что компонент еще не был должным образом измерен при создании ваших линий. Вы можете попробовать переопределить updateDisplayList и установить высоту созданных вами линий в качестве параметра высоты, предоставленного методу updateDisplayList. Не создавайте строки в updateDisplayList, так как он может вызываться несколько раз в течение жизненного цикла компонента. Что касается жизненного цикла в целом, вот ссылка на график, который я нашел полезным в прошлом: http://danorlando.com/?p=122 Надежда, которая помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...