Форум 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=202232)

StasHappy 03.07.2013 22:58

Свойства загруженного в прелоадер объекта
 
Вечер добрэ.

Вот так, у меня выглядит внешний прелоадер:
Первый кадр:

Код AS3:

import flash.events.*;
import flash.system.Security;
import flash.system.LoaderContext;
 
var ldr:Loader = new Loader();
var url:String = loaderInfo.parameters.path;
Security.allowDomain("*");
Security.loadPolicyFile("crossdomain.xml");
var ldrContext:LoaderContext = new LoaderContext(true);
 
if(url!=null) {
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,swf_loaded);
ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, swf_error);
ldr.load(new URLRequest(url),ldrContext);
}
 
function swf_error(e:Event):void {
    removeEventListener(Event.COMPLETE,swf_loaded);
}
function swf_loaded(e:Event):void {
    nextFrame();
}
stop();

Второй кадр:
Код AS3:

        ldr.x = (stage.stageWidth - ldr.width)/2;
        ldr.y = (stage.stageHeight - ldr.height)/2;
 
        addChild(ldr);

До недавнего времени всё было хорошо. Но сегодня я заметил, что загружаемые Flash'ки, неправильно позиционируются в окне. Стал копать код. В итоге выяснил следующее. Во втором кадре, мы выясняем ширину и высоту объекта ldr. Вот здесь то и кроется ошибка. Ради эксперимента, создал flash'ку с размером рабочего окна в 550x450 пикселов и поместил на его сцену закрашенный прямоугольник в 150x150 пикселов. Далее загрузил эту flash'ку в свой прелоадер и глянул какое значение ширины и высоты, возвращает объект ldr. И выяснилось, что он показывает не 550x450 пикселов, а 150x150 пикселов. То есть он, берет значение ширины и высоты не рабочей области загруженной flask'ки, а размер находящегося в нём закрашенного прямоугольника.

Вопрос. Как узнать точную ширину и высоту загруженного объекта(его рабочей области)?

maxkar 03.07.2013 23:07

Вроде бы Loader.contentLoaderInfo.width и Loader.contentLoaderInfo.height.

StasHappy 03.07.2013 23:45

Цитата:

Вроде бы Loader.contentLoaderInfo.width и Loader.contentLoaderInfo.height.
Спасибо, отличный вариант.)) Ещё один момент. Как установить новые значения ширины и высоты для рабочей области загруженной flask'ки?

belv 04.07.2013 00:35

Код AS3:

import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
 
var ldr:Loader = new Loader();
var url:URLRequest = new URLRequest("test1.swf");
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE ,completeListener);
ldr.load(url);
addChild(ldr);
function completeListener(e:Event):void
{
        ldr.content.width = 300; // или e.target.content.width = 300;
        ldr.content.height = 400;
        trace(ldr.content.width + " пикселей");//300 пикселей
        trace(ldr.content.height + " пикселей");//400 пикселей
}

Но если вы зададите высоту и ширину отличающуюся от значений загружаемого swf , у вас все содержимое этого swf файла тоже изменится в масштабе.

StasHappy 04.07.2013 01:08

Цитата:

Код AS3:

ldr.content.width = 300; // или e.target.content.width = 300;


Проделал этот фокус у себя. Итог такой:
Код AS3:

trace(ldr.content.width) // возвращает 150 пикселей
trace(ldr.content.height); // возвращает 150 пикселей

То есть возвращает не 550x450 пикселей(размер рабочей области), а 150х150 пикс.
Следующий вариант хорош, он возвращает то, что как раз и нужно, но он доступен только для чтения:
Код AS3:

trace(ldr.contentLoaderInfo.width);
trace(ldr.contentLoaderInfo.height);

Каким же способом можно установить новые значения ширины/высоты рабочей области загруженной flash'ки?

namespaces 04.07.2013 11:07

А не пробовали изменять размер в контейнере? думаю это и есть выход

belv 04.07.2013 11:35

Исходник можете выложить?Двух файлов.

Добавлено через 1 час 39 минут
Попробуйте так
Код AS3:

import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;
 
var ldr:Loader = new Loader();
var url:URLRequest = new URLRequest("test1.swf");
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE ,completeListener);
var loadMovieSwf:MovieClip;
ldr.load(url);
function completeListener(e:Event):void
{
        loadMovieSwf = e.target.content;
        loadMovieSwf.addEventListener(Event.ADDED_TO_STAGE, addEvListener);
        addChild(loadMovieSwf);
}
function addEvListener(e:Event):void
{
        loadMovieSwf.removeEventListener(Event.ADDED_TO_STAGE, addEvListener);
        loadMovieSwf.width = 300;
        loadMovieSwf.height = 400;
}


StasHappy 04.07.2013 19:22

Вложений: 1
Цитата:

А не пробовали изменять размер в контейнере? думаю это и есть выход
В каком контейнере? Имелось ввиду в прелоадере?

Цитата:

Код AS3:

import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;
 
var ldr:Loader = new Loader();
var url:URLRequest = new URLRequest("test1.swf");
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE ,completeListener);
var loadMovieSwf:MovieClip;
ldr.load(url);
function completeListener(e:Event):void
{
        loadMovieSwf = e.target.content;
        loadMovieSwf.addEventListener(Event.ADDED_TO_STAGE, addEvListener);
        addChild(loadMovieSwf);
}
function addEvListener(e:Event):void
{
        loadMovieSwf.removeEventListener(Event.ADDED_TO_STAGE, addEvListener);
        loadMovieSwf.width = 300;
        loadMovieSwf.height = 400;
}


Попробовал. Ничего не вышло. Я думаю проще будет скинуть полный код.

Первый кадр:
Код AS3:

import flash.events.*;
import flash.system.Security;
import flash.system.LoaderContext;
import flash.display.Loader;
import flash.net.URLRequest;
 
var ldr:Loader = new Loader();
var url:String = loaderInfo.parameters.path;
Security.allowDomain("*");
Security.loadPolicyFile("crossdomain.xml");
var ldrContext:LoaderContext = new LoaderContext(true);
 
if(url==null) { // на это не обращайте внимание. поставил для эксперимента
        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,swf_loaded);
        ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, swf_error);
        ldr.load(new URLRequest("c:/test1.swf"),ldrContext);
}
 
function swf_error(e:Event):void {
    removeEventListener(Event.COMPLETE,swf_loaded);
}
function swf_loaded(e:Event):void {
    nextFrame();
}
 
stop();

Второй кадр:
Код AS3:

stage.scaleMode = "noBorder";
var delitel = 0;
var movikWidth = ldr.contentLoaderInfo.width;
var movikHeight = ldr.contentLoaderInfo.height;
 
trace(movikWidth);
trace(movikHeight);
trace("-");
trace(ldr.width);
trace(ldr.height);
 
        if(movikWidth >= movikHeight) {
                if(movikWidth/movikHeight >= stage.stageWidth/stage.stageHeight) {
                        delitel = stage.stageHeight/movikHeight;
                        ldr.width = movikWidth*delitel;
                        ldr.height = movikHeight*delitel;
                } else {
                        delitel = stage.stageWidth/movikWidth;
                        ldr.width = movikWidth*delitel;
                        ldr.height = movikHeight*delitel;
                }
        } else {
                        delitel = movikWidth/stage.stageWidth;
                        ldr.width = movikWidth/delitel;
                        ldr.height = movikHeight/delitel;       
        }
 
        ldr.x = (stage.stageWidth - movikWidth)/2;
        ldr.y = (stage.stageHeight - movikHeight)/2;
        addChild(ldr);

Осталось всего лишь изменить ширину и высоту загруженного объекта. То есть, заменить ldr.height и ldr.width чем то другим. Внизу я выложил flask'ку, которую пытаюсь загрузить в прелоадер и подогнать её размер.

belv 04.07.2013 19:42

Поставьте во второй кадр и протестируйте
Код AS3:

stage.scaleMode = "noBorder";
var delitel = 0;
var movikWidth = ldr.contentLoaderInfo.width;
var movikHeight = ldr.contentLoaderInfo.height;
 
trace(movikWidth);
trace(movikHeight);
trace("-");
 
 
        if(movikWidth >= movikHeight) {
                if(movikWidth/movikHeight >= stage.stageWidth/stage.stageHeight) {
                        delitel = stage.stageHeight/movikHeight;
                        ldr.content.width = movikWidth*delitel;
                        ldr.content.height = movikHeight*delitel;
                } else {
                        delitel = stage.stageWidth/movikWidth;
                        ldr.content.width = movikWidth*delitel;
                        ldr.content.height = movikHeight*delitel;
                }
        } else {
                        delitel = movikWidth/stage.stageWidth;
                        ldr.content.width = movikWidth/delitel;
                        ldr.content.height = movikHeight/delitel;       
        }
 
        ldr.x = (stage.stageWidth - movikWidth)/2;
        ldr.y = (stage.stageHeight - movikHeight)/2;
        addChild(ldr);
trace(ldr.width);
trace(ldr.height);

У меня работает .

StasHappy 04.07.2013 19:54

belv. По идее работает и у меня. Но зря вы переместили trace() в конец. Попробуйте вставить его обратно и посмотреть, правильные ли размеры возвращаются. И сами убедитесь.

Файл который я скинул test1.swf имеет размер рабочей области 330х250. В его сцене имеется всего лишь один объект(закрашеный синим цветом прямоугольник) размером в 150x150 пикселов. В итоге. Когда мы пытаемся загрузить этот файл в прелоадер выходит следующее:
Код AS3:

trace(ldr.content.width); // показывает 150 вместо 330 пикселов
trace(ldr.content.height); // показывает 150 вместо 250 пикселов

То есть, ldr.content.height и ldr.content.width, определяют не рабочую область загруженной flask'ки, а размер того прямоугольника, который в нём находится(с размером в 150x150).

Вставьте trace(ldr.width) и trace(ldr.height) в то место, где они стоят у меня в коде и посмотрите результат.

Добавлено через 21 минуту
В моём случае, получается так, что ldr.width и ldr.height меняют не размер рабочей области загруженной flash'ки, а тот прямоугольник расположенный в нём.. Вот в чём загвоздка.


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

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