Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   AIR: Event.RESIZE, контент "не успевает" за новыми размерами окна (http://www.flasher.ru/forum/showthread.php?t=127402)

litebox 13.07.2009 13:50

AIR: Event.RESIZE, контент "не успевает" за новыми размерами окна
 
Хочу программно обрабатывать изменение размеров окна, для чего написал такой код:
Код AS3:

<?xml version="1.0"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
        title="Map Creator" layout="absolute" applicationComplete="init(event)" xmlns:ns1="mapCreator.*" width="550" height="400"
        showStatusBar="true" verticalScrollPolicy="off" horizontalScrollPolicy="off">
        <mx:Script><![CDATA[
                import flash.events.Event;
 
                // application init
                public function init(e:Event):void
                {
                        stage.addEventListener(Event.RESIZE, eventAppResize);
                }
 
                private function eventAppResize(e:Event):void
                {
                        mapCanvas.x = 2;
                        mapCanvas.y = 2;
                        mapCanvas.width = width - vScroll.width - tileCanvas.width - 2 * 4;
                        mapCanvas.height = height - 42;
 
                        tileCanvas.x = vScroll.x + vScroll.width + 2;
                        tileCanvas.y = 2;
                        tileCanvas.width = 134;
                        tileCanvas.height = height - 42;
 
                        vScroll.x = mapCanvas.x + mapCanvas.width + 2;
                        vScroll.y = 2;
                        vScroll.height = mapCanvas.height;
 
                        hScroll.x = 2;
                        hScroll.y = mapCanvas.y + mapCanvas.height + 2;
                        hScroll.width = mapCanvas.width;
 
                }
    ]]></mx:Script>
        <mx:Canvas borderStyle="inset" backgroundColor="#000000" width="391" x="2" height="341" y="2" id="mapCanvas">
        </mx:Canvas>
        <mx:Canvas width="136" borderStyle="inset" backgroundColor="#000000" height="358" id="tileCanvas" x="412" y="2">
        </mx:Canvas>
        <mx:HScrollBar x="2" y="344" width="391" id="hScroll"/>
        <mx:VScrollBar height="341" x="394" y="2" id="vScroll"/>
</mx:WindowedApplication>

Беда в том, что если быстро дернуть мышкой при изменении размеров, контент окна не успевает, и получаются то щели, то компоненты налазят друг на друга. Если при этом равзернуть окно на весь экран, получается совсем печальная картина :(

wvxvw 13.07.2009 14:52

Попробуй в eventAppResize только менять флаг, кроме этого подписаться на энтерфрейм, и в нем уже выставлять свойства.

litebox 13.07.2009 15:10

Да, эта идея приходила в голову. Интересно, почему в том же Delphi, на событие OnResize не нужно было вешать TTimer? :D

Добавлено через 2 часа 4 минуты
при граматной расстановке контейнеров программный ресайз удалось убрать вообще. Но не решилась проблема с развертыванием/свертыванием окна. Дело в том, что при изменении размеров у меня пересоздатеся BitmapData, для вывода графики. Так вот, когда происходит развертывание окна - битмапа остается прежних размеров, а когда происходит свертываине - она становится максимльного размера. Т.е. событие
Код AS3:

stage.addEventListener(Event.RESIZE, eventAppResize);

наступает, как-бы, с отставанием на один шаг, как бороть данную проблему? Вешать ENTER_FRAME для отлавливания этого момента не хочется :(

wvxvw 13.07.2009 19:56

На самом деле enterFrame - это оптимизация... ресайз диспатчится гораздо чаще, чем происходит смена кадров, а при том, как во фреймворковских компонентах реализована валидация / инвалидация - если вы будете свойсва часто менять - там еще и не такие глюки будут.


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

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