Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   FLVPlayback skin hit area (http://www.flasher.ru/forum/showthread.php?t=111305)

teka 21.04.2008 19:57

FLVPlayback skin hit area
 
Юзаю flvplayback.swc . Проблема такая. При stage resize (и соотв. масштабировании всего на сцене) и включенном skinAutoHide перестает показываться собсно скин. Долго не мог понять в чем дело. Оказалось, что "уплывает" hit area для "органов управления". Как только для родителя возвращаю scale в 100%, все нормально.

Также установлены VideoScaleMode.MAINTAIN_ASPECT_RATIO и VideoAlign.CENTER. Игрался с registrationWidth и т.п., но безрезультатно. Может кто знает решение "правильного" позиционирования скина?
P.S. Скин стандартный, SkinOverPlaySeekMute.swf .

silin 21.04.2008 21:09

если ты положишь пример проблемы в чистом виде, то шансы получить ответ сильно возрастут..

teka 21.04.2008 23:55

Код:

package
{
        import fl.video.FLVPlayback;
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.display.StageScaleMode;
        import flash.display.StageAlign;
        import flash.events.Event;
        import fl.video.VideoScaleMode;
        //
        public class MainTestVideo extends Sprite
        {
                private var grandSpr:Sprite;
                private var myPlayer:FLVPlayback;
                //
                public function MainTestVideo():void
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
                        grandSpr = new Sprite;
                        var rect:Shape = new Shape();
                        rect.graphics.beginFill(0xFF0000);
                        rect.graphics.drawRect(0, 0, 500, 400);
                        rect.graphics.endFill();
                        grandSpr.addChild(rect);
                        addChild(grandSpr);
                       
                        stage.addEventListener(Event.RESIZE, onStageResize);
                        myPlayer = new FLVPlayback();
                        myPlayer.source = 'video.flv';
                        myPlayer.skin = 'SkinOverPlaySeekMute.swf';
                        myPlayer.width = 300;
                        myPlayer.height = 200;
                        //myPlayer.scaleMode = VideoScaleMode.NO_SCALE;
                        //myPlayer.scaleMode = VideoScaleMode.MAINTAIN_ASPECT_RATIO;
                        myPlayer.scaleMode = VideoScaleMode.EXACT_FIT;
                        myPlayer.skinAutoHide = true;
                        myPlayer.skinFadeTime = .3;
                        myPlayer.skinBackgroundColor = 0x8A5917;
                        myPlayer.play();
                        onStageResize();
                        //grandSpr.addChild(myPlayer);
                }

                private function onStageResize(e:Event=null):void {
                        this.width = stage.stageWidth;
                        this.scaleY = this.scaleX;
                        this.x = this.y = 0;
                        trace(this.width, myPlayer.width, grandSpr.width);
                }
        }
}

После компиляции поиграйтесь с размером сцены и наблюдайте трейсы. А потом раскомментируйте строчку grandSpr.addChild(myPlayer); и опять следите за трейсами. Ага? :-)

teka 22.04.2008 00:19

Holy shit. Оказывается, все портит собсно скин. Если без него, то все нормально. С ним - размер клипа соответствует размеру самого ассета со скином.
Вот только как это "комфортно" обходить, если видео грузится глубоко и далеко в какой-то из вложенных-вложенных... чайлд-клипов?

silin 22.04.2008 00:35

интересно, чего ты добиваешься с помощью this.width = stage.stageWidth; ?
почему нельзя по-простому:
grandSpr.scaleY = grandSpr.scaleX=stage.stageWidth / 500; // ну или как там там на самом деле надо..
при этом все скалится, скин на месте (ну исчезает, как ему и положено при skinAutoHide = true), ник4аких дополнительных ухищрений не надо..

teka 22.04.2008 00:57

Вложений: 1
Гыы..сам не уверен. Если подскажешь решение -- буду признателен. Смысл же таков.
Эт фрагмент старого, давно используемого кода. У grandSpr есть grandMask. Весь клип центрируется по маске на сцене и по ней же скейлится (масштаб подгоняется так, чтобы маска стремилась по площади к площади сцены). Почему по маске? Размер grandSpr невозможно "зафиксировать" (из-за, опять же, невидимых областей).
Надеюсь, картинка поможет понять смысл.
Т.е., подытоживая, за "полезный" размер спрайта this я принимаю не реальный геометрический размер спрайта, а размер маски внутри него.

silin 22.04.2008 01:09

>>за "полезный" размер спрайта this я принимаю не реальный геометрический размер спрайта, а размер маски внутри него.
так и используй размер маски для расчетов..
а this в том контексте, что ты показал, это рутовый спрайт, он-то здесь причем?

teka 22.04.2008 01:11

хм...надо покумекать :-) thanx anyway :-))


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

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