Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как сделать перерисовку у flex spark компонента? (http://www.flasher.ru/forum/showthread.php?t=176957)

il phoenix 21.03.2012 15:15

Как сделать перерисовку у flex spark компонента?
 
Добрый день.
Создал кастомный контрол и для него скин, не могу понять как перерисовать компонент, когда присвоено свойство?
Код AS3:

<s:SkinnableComponent xmlns:fx="http://ns.adobe.com/mxml/2009" 
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  width="70" height="70"
                  buttonMode="true">
        <fx:Declarations>
                <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <fx:Script>
                <![CDATA[
                        private var _coins:int = 1;
 
                        public function set coins(value:int):void { _coins = value; }                       
                        public function get coins():int{return _coins; }
                ]]>
        </fx:Script>
</s:SkinnableComponent>



Код AS3:

<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:mx="library://ns.adobe.com/flex/mx">
        <!-- host component -->
        <fx:Metadata>
                [HostComponent("view.components.UserAvatar")]
        </fx:Metadata>
        <s:Label id="coins"
                        color="0xFF0000"
                        text="{hostComponent.coins}"
                        fontSize="14"
                        fontWeight="bold"
                        x="3"
                        y="{hostComponent.height - coins.height}"/>
</s:Skin>

Добавлено через 1 час 16 минут
подсказали что вот так надо делать:

Код AS3:

<s:SkinnableComponent ...
        <fx:Script>
                <![CDATA[
                        private var _coins:int = 1;
 
                        public function set coins(value:int):void { _coins = value;skin.invalidateDisplayList(); }                       
                        public function get coins():int{return _coins; }
                ]]>
        </fx:Script>
</s:SkinnableComponent>



Код AS3:

<s:Skin ...
<fx:Script>
                <![CDATA[
                        override protected function updateDisplayList(w:Number, h:Number):void
                        {
                                super.updateDisplayList(w, h);
 
                                coins.text = hostComponent.coins.toString();
                        }
                ]]>
        </fx:Script>
        ...
</s:Skin>


alatar 21.03.2012 16:53

1. Не никакого смысла писать сам компонент в mxml.
2. Свойство используемое в байндинге должно быть с метатегом Bindable.
3. Части важные для логики работы компонента должны быть объявлены в самом компоненте с метатегом SkinPart. Это даст вам доступ к части скина в компоненте.

В общем вам сюда.

P.S. Перерисовка вызывается методом invalidateDisplayList().

Добавлено через 1 минуту
P.P.S. Обращайте внимание на все сообщения дебаггера, включая предупреждения, это поможет вам понять суть проблемы.

il phoenix 21.03.2012 17:59

alatar, спасибо за советы

alatar 21.03.2012 18:08

Цитата:

подсказали что вот так надо делать:
Отличный способ выстрелить себе в ногу. У вас нет гарантии, что в этот момент skin уже создан.

djyamato 22.03.2012 13:28

Цитата:

Сообщение от il phoenix (Сообщение 1070287)
Код AS3:

<s:Skin ...
<fx:Script>
                <![CDATA[
                        override protected function updateDisplayList(w:Number, h:Number):void
                        {
                                super.updateDisplayList(w, h);
 
                                coins.text = hostComponent.coins.toString();
                        }
                ]]>
        </fx:Script>
        ...
</s:Skin>


я бы это перенес в
Код AS3:

override protected function commitProperties():void

потому что перерисовка компонента может быть часто, например, разрешение экрана изменилось, так зачем же лишний раз из-за этого назначать значение

Цитата:

Сообщение от il phoenix (Сообщение 1070287)
подсказали что вот так надо делать:

Код AS3:

invalidateProperties()

p.s. а, вообще, вам же просто байндэйбл [Bindable] нужно сделать у хост компонента переменную и назначить ее в скине кому нужно в качестве источника информации(в Вашем случае, видимо, для Label)
p.p.s. hostComponent, по идее, вообще не должен знать о том есть у него skin или нет


Часовой пояс GMT +4, время: 12:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.