Можно ли получить старое полноэкранное масштабирование с помощью FLVPlayback и прошить 9.0.115+?
-
01-07-2019 - |
Вопрос
В предыдущих версиях Flash переход в полноэкранный режим увеличивал высоту и ширину сцены до размеров экрана.Теперь, когда появилось аппаратное масштабирование, высота и ширина устанавливаются в соответствии с размерами видео (плюс границы, если соотношение сторон другое).
Это нормально, если только у вас нет элементов управления видео.Раньше вы могли контролировать их размер;но теперь они увеличены в том же масштабе, что и видео, и ужасно пикселизированы.Управление уродливое, субтитры нечитабельны.
Пользователь может отключить аппаратное масштабирование, но все, что можно сделать, — это отключить сглаживание.Органы управления по-прежнему раздуты до безобразия.
Есть ли способ вернуть старое поведение масштабирования?
Решение 2
В конце концов я нашел ответ на этот вопрос.Проблема в том, что компонент FLVPlayback теперь использует свойство stage.fullScreenSourceRect для входа в полноэкранный режим с аппаратным масштабированием.Когда он это делает, он растягивает отображаемую область, заданную stage.fullScreenSourceRect, чтобы заполнить экран, а не увеличивает размер сцены или каких-либо компонентов.
Чтобы остановить это, вам необходимо создать подкласс FLVPlayback, который использует подкласс UIManager, и переопределить функцию, устанавливающую stage.fullScreenSourceRect.С другой стороны, вы теряете аппаратное масштабирование;но с другой стороны, ваш плеер не выглядит так, как будто его нарисовал цветными карандашами трехлетний ребенок.
CustomFLVPlayback.as:
import fl.video.*;
use namespace flvplayback_internal;
public class CustomFLVPlayback
{
public function CustomFLVPlayback()
{
super();
uiMgr = new CustomUIManager(this);
}
}
CustomUIManager.as:
import fl.video.*;
import flash.display.StageDisplayState;
public class CustomUIManager
{
public function CustomUIManager(vc:FLVPlayback)
{
super(vc);
}
public override function enterFullScreenDisplayState():void
{
if (!_fullScreen && _vc.stage != null)
{
try
{
_vc.stage.displayState = StageDisplayState.FULL_SCREEN;
} catch (se:SecurityError) {
}
}
}
}
Мы добавляем FLVPlayback в наш фильм с помощью ActionScript, поэтому нам просто нужно заменить
var myFLVPLayback:FLVPlayback = new FLVPlayback();
с
var myFLVPLayback:CustomFLVPlayback = new CustomFLVPlayback();
Я не знаю, есть ли способ сделать пользовательский класс доступным в библиотеке компонентов.
Другие советы
Вот еще один способ решить эту проблему, он проще и, кажется, мне подходит.
myFLVPlayback.FullScreenTakeOver = false;
А fullScreenTakeOver
свойство было представлено в Flash Player 9. обновление 3.Вся документация немного расплывчата, но здесь есть немного больше информации:
Используя FLVPlayback
компонент с Flash Player 9, обновление 3
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.addEventListener(Event.RESIZE, onStageResize);
function onStageResize(event:Event):void {
//do whatever you want to re-position your controls and scale the video
// here's an example
myFLVPlayback.width = stage.stageWidth;
myFLVPlayback.height = stage.stageHeight - controls.height;
controls.y = stage.stageHeight - controls.height;
}
Или, и я не совсем уверен в этом, вы можете попытаться масштабировать 9 фрагментов в FLVPlayback, но я не знаю, сработает ли это.
Учебное пособие по 9-срезовому масштабированию: http://www.sephiroth.it/tutorials/flashPHP/scale9/