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

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

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Question Как вручную растягивать видео-изображение при изменении размера окна?

Делаю видео плеер. Возникла проблема.
Когда изменяются размеры окна FlashPlayer, то видео изображение должно растягиваться пропорционально и показываться полностью, без обрезки. Такой режим называется StageScaleMode.SHOW_ALL. Но, так как у меня ещё есть кнопки управления, то такой режим не подойдет. Я использую StageScaleMode.NO_SCALE, чтобы вручную расставлять кнопки управления. Следовательно, нужно вручную изменять размеры видео изображения.

Проблему можно увидеть по ссылке.
Видео изменяет свои размеры, но когда ширина окна меньше ширины видео, то часть видео обрезается.
Что нужно ещё дописать в функцию onResizeListener, чтобы исправить эту проблему?

Вот код:

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import flash.ui.ContextMenu;
	import flash.ui.ContextMenuItem;
 
	/**
	 * Главный класс
	 * @author Subbotin Daniil (dan.subbotin[at]gmail.com)
	 */
	public class App extends Sprite 
	{
		//----------------------------------
		//  Переменные отвечающие за воспроизведение видео файла
		//----------------------------------
 
		private static const URL:String = "video1.flv";
		private var ns:NetStream;
		private var video:Video;
 
		//----------------------------------
		//  Параметры видео файла
		//----------------------------------
 
		private var videoWidth:int;
		private var videoHeight:int;
		private var aspectRatio:Number;
 
		public function App():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(event:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			// Настройка отображения
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
			// Инициализация видео плеера
			initPlayer();
 
			// Регистрация слушателей событий
			stage.addEventListener(Event.RESIZE, onResizeListener);
 
			onResizeListener(null);
		}
 
		/**
		 * Инициализация видео плеера
		 */
		private function initPlayer():void 
		{
			// Настройка соединения
			var nc:NetConnection = new NetConnection();
			nc.connect(null);
 
			// Настройка получателя информации о видео файле
			var client:Object = { };
			client.onMetaData = function(metadata:Object):void
			{
				videoWidth = metadata.width;
				videoHeight = metadata.height;
				aspectRatio = videoWidth  / videoHeight;
 
				onResizeListener(null);
			}
 
			// Настройка потока
			ns = new NetStream(nc);
			ns.client = client;
 
			// Создание и отображение видео экрана
			video = new Video();
			video.attachNetStream(ns);
			addChild(video);
 
			ns.play(URL);
		}
 
	//--------------------------------------------------------------------------
	//
	//  Обработчики событий
	//
	//--------------------------------------------------------------------------
 
		/**
		 * Обрабатывает изменение размеров приложения
		 */
		private function onResizeListener(event:Event):void 
		{
			if (stage.stageWidth > stage.stageHeight)
			{				
				video.height = stage.stageHeight;
				video.width = stage.stageHeight * aspectRatio;
 
				video.x = stage.stageWidth / 2 - video.width / 2;
				video.y = 0;
			}
			else if (stage.stageWidth < stage.stageHeight)
			{
				video.width = stage.stageWidth;
				video.height = stage.stageWidth / aspectRatio;
 
				video.x = 0;
				video.y = stage.stageHeight / 2 - video.height / 2;
			}
 
		}
 
	}
 
}

Старый 01.07.2011, 13:41
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 2  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Условия мне кажутся подозрительными
Код AS3:
if (stage.stageWidth > stage.stageHeight)
...
if (stage.stageWidth < stage.stageHeight)

Старый 01.07.2011, 13:45
TWETTI вне форума Посмотреть профиль Отправить личное сообщение для TWETTI Найти все сообщения от TWETTI
  № 3  
Ответить с цитированием
TWETTI
 
Аватар для TWETTI

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Сделал так:
Код AS3:
private function onResizeListener(event:Event):void 
{
	if (video.width < stage.stageWidth)
	{
		video.height = stage.stageHeight;
		video.width = stage.stageHeight * aspectRatio;
 
		video.x = stage.stageWidth / 2 - video.width / 2;
		video.y = 0;
	}
	else
	{
		video.width = stage.stageWidth;
		video.height = stage.stageWidth / aspectRatio;
 
		video.x = 0;
		video.y = stage.stageHeight / 2 - video.height / 2;
	}
 
}
Теперь нормально, но изображение дергается(то увеличивается то уменьшается). Чего-то не хватает.

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

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Может так:
Код AS3:
private function onResizeListener(event:Event):void 
{
 
	if (videoWidth / stage.stageWidth < videoHeight / stage.stageHeight)
	{
		//ровняем по высоте
	}
	else
	{
		//ровняем по ширине
	}
 
}
АПД: подправил video.width -> videoWidth и тоже самое с высотой


Последний раз редактировалось kackbip; 01.07.2011 в 13:52.
Старый 01.07.2011, 13:50
DJDrugsounD вне форума Посмотреть профиль Отправить личное сообщение для DJDrugsounD Найти все сообщения от DJDrugsounD
  № 5  
Ответить с цитированием
DJDrugsounD
 
Аватар для DJDrugsounD

Регистрация: Jun 2011
Сообщений: 153
может потому что теперь когда video.width == stage.stageWidth то выполняется вторая чать функции
Код AS3:
	else
	{
		video.width = stage.stageWidth;
		video.height = stage.stageWidth / aspectRatio;
 
		video.x = 0;
		video.y = stage.stageHeight / 2 - video.height / 2;
	}

Старый 01.07.2011, 13:52
TWETTI вне форума Посмотреть профиль Отправить личное сообщение для TWETTI Найти все сообщения от TWETTI
  № 6  
Ответить с цитированием
TWETTI
 
Аватар для TWETTI

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
kackbip, Спасибо! Заработало.


Последний раз редактировалось TWETTI; 01.07.2011 в 14:00.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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