Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.01.2009, 16:09
starserfer вне форума Посмотреть профиль Отправить личное сообщение для starserfer Найти все сообщения от starserfer
  № 1  
Ответить с цитированием
starserfer

Регистрация: May 2008
Сообщений: 41
По умолчанию XML слайд-шоу: определение и изменение размеров изображений

Размера, в смысле ширины и длины. То есть имеем динамическую загрузку xml и последовательную загрузку картинок в клип по нажатию на определенные кнопки. Примерно так:
Код AS1/AS2:
sourceXML.load(myXml);...
buttonNextMove.onPress=function():Void
{img_loader.loadClip("путь к текущему изображению", img_conteiner;...}
Окошко слайд-шоу имеет размеры, к примеру, 800Х600. Размеры изображений, лежащие в определенной для них папке неизвестны (предположительно, они больше). Существует ли возможность определения размеров (_width и _height) каждого изображения во время подгрузки (нажатие на кнопки "вперед" или "назад") и динамической их подгонки под размеры слайд-шоу во время отображения?

Старый 30.01.2009, 16:34
amexdesign вне форума Посмотреть профиль Отправить личное сообщение для amexdesign Посетить домашнюю страницу amexdesign Найти все сообщения от amexdesign
  № 2  
Ответить с цитированием
amexdesign

Регистрация: Jan 2009
Адрес: Германия, Bochum
Сообщений: 169
Отправить сообщение для amexdesign с помощью Skype™
Цитата:
Существует ли возможность определения размеров (_width и _height) каждого изображения во время подгрузки (нажатие на кнопки "вперед" или "назад") и динамической их подгонки под размеры слайд-шоу во время отображения?
во время подгрузки - нет, только после завершения подгрузки...
Код AS1/AS2:
{img_loader.loadClip("путь к текущему изображению", img_conteiner;...}
используйте для подгрузки изображений loadMovieClip-Класс, примерно так:
Код AS1/AS2:
var mclListener:Object = new Object();
mclListener.onLoadStart = function(target_mc:MovieClip){
	preloader.percent.text = "0%";
};
mclListener.onLoadProgress = function(target_mc:MovieClip, bytesLoaded:Number, bytesTotal:Number) {
	preloader.percent.text = Math.round(bytesLoaded/bytesTotal*100) + " %";
};
mclListener.onLoadComplete = function(target_mc:MovieClip) {
	Tweener.addTween(preloader, {_alpha:0, time:1.800000, transition:"easeOutExpo", onComplete:function () {
		Tweener.addTween(img_conteiner, {_alpha:100, time:2.000000, transition:"easeOutExpo"});
	}});
};
mclListener.onLoadInit = function(target_mc:MovieClip) {
	trace(target_mc._width);   // выдаёт значение _width img_conteiner`а  
	trace(target_mc._height);  // выдаёт значение _height img_conteiner`а
};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
image_mcl.loadClip("путь к текущему изображению", img_conteiner);

Старый 30.01.2009, 17:43
starserfer вне форума Посмотреть профиль Отправить личное сообщение для starserfer Найти все сообщения от starserfer
  № 3  
Ответить с цитированием
starserfer

Регистрация: May 2008
Сообщений: 41
Естественно, после загрузки каждого изображения. Некорректно выразился. К вашему примеру. Я как раз использую класс loadMovieClip. В этой части мой код немного проще, по-сути, отлавливается только событие onLoadComplete (не используется предзагрузчик - десктопное приложение) и как будто бы все понятно (хотя хотелось бы поподробней что есть Tweener.addTween). Но что делать после onLoadComplete? img_conteiner создается при помощи createEmptyMovieClip(), а простая проверка окончания загрузки каждого изображения
Код AS1/AS2:
imgLoadListener.onLoadComplete = function():Void 
	{
trace(img_conteiner._width);trace(img_conteiner._height);
	};
возвращает два ноля, хотя ожидалось, что контейнер примет размеры содержимого. Где изъян в рассуждениях?

Старый 30.01.2009, 18:07
Fatality вне форума Посмотреть профиль Отправить личное сообщение для Fatality Найти все сообщения от Fatality
  № 4  
Ответить с цитированием
Fatality
 
Аватар для Fatality

Регистрация: Jan 2009
Адрес: Одесса
Сообщений: 309
Отправить сообщение для Fatality с помощью ICQ
Попробуйте использовать событие onLoadInit вместо onLoadComplete.

Старый 30.01.2009, 18:14
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Попробуйте в поиске набрать "слайд-шоу". Право, сударь, это один из самых обсуждаемых вопросов.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 30.01.2009, 18:33
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 6  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
Код AS1/AS2:
imgLoadListener.onLoadInit = function(target_mc:MovieClip) {
	trace(target_mc._width);   // выдаёт значение _width img_conteiner`а  
	trace(target_mc._height);  // выдаёт значение _height img_conteiner`а
};
Поробуй так.
А дальше можно скалить изображение для подгонки под размеры "сцены", на случай если изображения будут произвольной величины.

Старый 30.01.2009, 19:19
starserfer вне форума Посмотреть профиль Отправить личное сообщение для starserfer Найти все сообщения от starserfer
  № 7  
Ответить с цитированием
starserfer

Регистрация: May 2008
Сообщений: 41
onLoadInit решило проблему. Всем спасибо!

Старый 20.02.2009, 03:38
starserfer вне форума Посмотреть профиль Отправить личное сообщение для starserfer Найти все сообщения от starserfer
  № 8  
Ответить с цитированием
starserfer

Регистрация: May 2008
Сообщений: 41
Не думал я, что снова придется поднимать эту тему...
Но возникла новая проблема. Суть ее в следующем: в слайд-шоу предусмотрена возможность изменения размера картинок. То есть имеем ролик размера 800Х600. Размеры картинок передаются из атрибутов XML. На событие onLoadInit повесил код со сложным ветвлением, вычисляющий какого размера должна быть картинка: если ее ширина и длина больше, чем 800Х600 - она ужимается, если меньше - выводится без изменений.
Весь код обработчика довольно длинный, приведу фрагмент, используемый в случае, если картинка больше 800Х600
Код AS1/AS2:
else if (img_width > 800)
	{
		if (img_width > img_height)
		{
			scale = img_width / 800;
			page_mc._width = 800;
			page_mc._height = Math.round(img_height / scale);
 
		}
		else if (img_width < img_height)
		{
			scale = img_height / 600;
			page_mc._height = 600;
			page_mc._width = Math.round(img_width / scale);
		}
	}
img_width, img_height - ширина и длина картинки из атрибутов XML;
page_mc - клип, в который загружается изображение. Ему принудительно назначается ширина 800 (в случае, если ширина больше высоты), а высота вычисляется в зависимости от величины scale, которая характеризует, во сколько раз ширина картинки больше ширины ролика.
Все это очевидно и тривиально. Программа замечательно работала с картинками 400х400, 400х600, 800х600 и т.д. Самая большая картинка была 2848х2136, самая нестандартная 2592х3888. Радость моя кончилась, когда в папку были добавлены изображения 3888х2592. Что произошло? Значительная область с правой стороны оказалась просто срезанной, не ужатой, а именно срезанной; она исчезла, а картинка, не взирая на то, что она в разы шире чем 800, видимо за счет того, что изрядный кусок канул где-то в черной дыре, растянулась по ширине! Если же изменить реальный размер картинки, например, до испытанных уже 2848х2136, не исправляя ничего в XML (а если исправить, то и подавно), все выводится как положено. И еще один загадочный, почти мистический момент. Если мы после строчки, где задается page_mc._width = 800, поставим trace(page_mc._width ), выводить будет (при загрузке картинок) 800, 799.99, 799.95, 800, 799.99. И это при том, что 800 задано принудительно! Вот такая повесть получилась, почти роман. Кому было интересно, прошу поделиться соображениями.


Последний раз редактировалось starserfer; 20.02.2009 в 03:42.
Старый 20.02.2009, 11:10
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 9  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
Ну я бы попробовал _yscale / _xscale вместо _width / _height. Затем, возможно существует ограничение по размеру картинки, ограничение по битмапу же есть (2880 пикселей по любой стороне). На счет размеров, писал много раз что флеш весьма неточен, он переводит число в двоичный код, а потом обратно, отсюда и погрешность, хотя вобщем то это ж незаметно в данном случае.
З.Ы. а зачем размер каринки пиать в хмл если пользуетесь мувиклиплоадером?..можно ж узнавать при загрузке и оттуда плясать (меньше букавак в хмл, а в код всего + 2 строчки)

Старый 20.02.2009, 16:54
starserfer вне форума Посмотреть профиль Отправить личное сообщение для starserfer Найти все сообщения от starserfer
  № 10  
Ответить с цитированием
starserfer

Регистрация: May 2008
Сообщений: 41
Предположение об ограничении размера картинки действительно выглядит правдоподобным, поскольку я уже говорил, что при уменьшении ширины изображения до 2848 все работает нормально. И у меня были предположения на этот счет. Но где можно поподробнее прочитать об этих ограничениях? Откуда взялось число 2880? В мануале вроде не встречал.
По поводу данных из атрибутов XML. Вначале я и не собирался прописывать там ширину и высоту картинки, полагая, что при каждой загрузке функция сама будет возвращать текущий размер. Однако, вероятно, существует какая-то тонкость, которую я не уловил, заключающаяся в том, что размер (_width) не каждой картинки определялся корректно (возможно, из-за той погрешности, о которой упомянул nOobCrafter). Поэтому и упростил таким образом. И последнее. Почему _yscale / _xscale кажется предпочтительней? Не дают погрешности?

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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