Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ручной ресайз и окно браузера. (http://www.flasher.ru/forum/showthread.php?t=120628)

Kolan 26.01.2009 18:51

Ручной ресайз и окно браузера.
 
Здравствуйте!

Есть флешка в которой отключено масштабирование (StageScaleMode.NO_SCALE), а резайз делается вручную.

При открытии флешки в браузере ресайз не срабатывает до тех пор пока пользователь не начнет масштабировать окно браузера.

Как растянуть сцену на всю ширину окна браузера?


И еще, если пользователь перейдет на другую закладку и изменит размеры окна, то флешка не получит уведомления о ресайзе и когда пользователь вернется обратно на флешку, то её старый размер. То есть если пользователь уменьшит окно, то часть флешки не будет видна.

Как с этим бороться?

murz 26.01.2009 18:59

1.При инициализации своего приложения/фильма самостоятельно вызовете
метод ресайза.
2. подпишитесь на событие получение флешкой фокуса и так же вызовете метод ресайза

mongoliano 26.01.2009 20:14

Цитата:

Сообщение от murz (Сообщение 793648)
2. подпишитесь на событие получение флешкой фокуса и так же вызовете метод ресайза

Присоеденил ресайз к событиям FocusEvent.FOCUS_IN и FocusEvent.FOCUS_OUT. Всёравно в FFox3 если сайт был первым открытым в браузере, потом открыть ещё одну вкладку и вернуться к сайту, события не происходит и сайт остаётся обрезанным внизу. Может подскажите какое именно событие нужно?:rolleyes:

murz 26.01.2009 21:25

Код AS3:

stage.addEventListener(Event.ACTIVATE, activateHandler);
stage.addEventListener(Event.RESIZE, resizeHandler);
 
private function activateHandler(e:Event):void {
        trace( "activate : ", stage.stageWidth, stage.stageHeight);
        resize();
                }
 
private function resizeHandler(e:Event):void {
        trace( "resize : ",stage.stageWidth, stage.stageHeight);
        resize();
                }
private function resize():void {
//any
}

Везде работает, только в ФФ3 при ресайзе в меньшую сторону глючит, в большую все окей. Я использовал для теста SWFObject, может он виноват.

Kolan 26.01.2009 21:37

murz, странно у меня не работает.

Код AS3:

class Main {
 
        ...
 
        public function new() {
                Lib.current.stage.scaleMode = StageScaleMode.NO_SCALE;
                Lib.current.stage.addEventListener(Event.RESIZE, onStageResize);               
                Lib.current.stage.addEventListener(Event.ACTIVATE, onActivate);               
 
                ...
 
                ...
 
 
                ...
        }
 
        ...
 
        function highLevelResize() {
                ...
        }
 
        function onStageResize(event:Event) {
                highLevelResize();
        }
 
        function onActivate(event: Event) {
                trace("onActivate");
                highLevelResize();
        }
 
    static function main() {
                new Main();
    }
}

Стоит оговорится, что я использую haXe, но, имхо, это не очень важно.

Трейс видно только запуске флешки в плеере (при открытии, при развертывании окна плеера), а вот в браузере трейса нет.

Пробовал ФФ3 и Оперу.

murz 26.01.2009 22:05

в haXe опыта у меня нет.
Делаю так:
Код AS3:

package {
 
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.display.LoaderInfo;
 
        /**
        * ...
        * @author Aleksey Matveev
        * @version 0.1
        */

 
        public class Main extends Sprite {
                //--------------------------------------------------------------------------
                //
                //  Public prop
                //
                //--------------------------------------------------------------------------
                public const URL:String = "http://imgl.yandex.net/i/www/logo1.png";
                //--------------------------------------------------------------------------
                //
                //  Protected prop
                //
                //--------------------------------------------------------------------------
                //--------------------------------------------------------------------------
                //
                //  Private prop
                //
                //--------------------------------------------------------------------------
                private var _loader:Loader;
                //--------------------------------------------------------------------------
                //
                //  Cunstructor
                //
                //--------------------------------------------------------------------------
 
                public function Main():void {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                //--------------------------------------------------------------------------
                //
                //  Private methods
                //
                //--------------------------------------------------------------------------
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        _loader = new Loader();
                        _loader.load(new URLRequest(URL));
 
                        addChild(_loader);
                        _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
                        stage.addEventListener(Event.ACTIVATE, activateHandler);
            stage.addEventListener(Event.RESIZE, resizeHandler);
                }
 
                private function loadCompleteHandler(e:Event):void {
                        trace("load Complete");
                        resize();
                }
 
                private function activateHandler(e:Event):void {
                        trace( "activate : ", stage.stageWidth, stage.stageHeight);
                        resize();
                }
 
                private function resizeHandler(e:Event):void {
                        trace( "resize : ",stage.stageWidth, stage.stageHeight);
                        resize();
                }
                private function resize():void {
                        //trace("<<<>>>");
                        _loader.x = (stage.stageWidth >> 1) - (_loader.width >> 1);
                        _loader.y = (stage.stageHeight >> 1) - (_loader.height >> 1);
                }
 
 
        }
 
}


Kolan 30.01.2009 16:26

Благодарю murz.

Во-первых, сам алгоритм масштабирования содержал ошибку. А во-вторых, его надо былом запускать и при ADDED_TO_STAGE.


В итоге получилось так:

Код AS3:

class Main {
 
        public function new() {
                Lib.current.stage.scaleMode = StageScaleMode.NO_SCALE;
                Lib.current.addEventListener(Event.RESIZE, onStageResize);               
                Lib.current.addEventListener(Event.ACTIVATE, onActivate);               
                Lib.current.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);               
 
...
        }
 
 
        function highLevelResize() {
                for (i in 0...Lib.current.numChildren) {
                        if (Reflect.hasField(Lib.current.getChildAt(i), "updateSizeAndPos")) {
                                var control:Control = cast(Lib.current.getChildAt(i), Control);
                                control.updateSizeAndPos();
                        }
                }
        }
 
 
        private function onAddedToStage(e:Event):Void
        {
                highLevelResize();
        }
 
        function onStageResize(event:Event) {
                highLevelResize();
        }
 
        function onActivate(event: Event) {
                highLevelResize();
        }
 
    static function main() {
                new Main();
    }
}

Работает корректно в ФФ, ИЕ и Хроме. В других не проверял.


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

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