quinta-feira, 15 de maio de 2008

FullScreen do flash não funciona em players abaixo de 9.0.28, e agora?

Desde a versão 9.0.28 do flash é possível definir seu swf para rodar em tela cheia de maneira bem simples. Também é possivel definir um listener para ser notificado quando o modo de exibição do flash é alterado de normal para fullscreen e vice-versa. Contudo, se você colocar essas funcionalidades, seu swf não rodará em versões anteriores a 9.028.

O jeito então é alterar seu ActionScript para só setar a o fullscreen quando a versão for compatível. Veja abaixo como isso pode ser feito:
import flash.display.StageDisplayState;

public class Main extends MovieClip {

//...

function suportaTelaCheia():Boolean {
//Verifica versao >= que 9.0.28
}
function onBotaoTelaCheiaClique(event:MouseEvent):void {
if( suportaTelaCheia() ) {
stage.displayState = StageDisplayState.FULL_SCREEN;
}
}
function onBotaSaiTelaCheiaClique(event:MouseEvent):void {
if( suportaTelaCheia() ) {
stage.displayState = StageDisplayState.NORMAL;
}
}

//...
}
Apesar da classe flash.display.StageDisplayState não existir no player com versão menor que 9.0.28, a importação dela não trará erro, pois o flash só executa a importação de uma classe quando faz uso dela. Portanto a seleção da versão feita com o método suportaTelaCheia impede seu uso e consequente importação.

O problema maior é quando precisamos definir um listener para sabermos quando o swf entrou em modo fullscreen e quando saiu. Normalmente isso é necessário quando precisamos redimensionar, ou adicionar elementos ao stage. No caso o código, sem o tratamento de versão, ou seja, o que daria erro nas versões de flash anteriores a 9.0.28 ficaria assim:
import flash.events.FullScreenEvent;

public class Main extends MovieClip {

//...

private function onStage(event:Event):void {
stage.addEventListener( FullScreenEvent.FULL_SCREEN, redrawFullScreen );
}

//...

function redrawFullScreen(event:FullScreenEvent):void {
if( event.fullScreen ) {
//Posicionar elementos para tela cheia
} else {
//Posicionar elementos para tamanho normal
}
}

//....

}
O grande problema disso é que o uso da classe FullScreenEvent está na definição do método redrawFullScreen e portanto não é possivel defini-lo somente quando for uma versão ou outra. O jeito então então é mudar a assinatura do método, para ao invés de receber um FullScreenEvent receber um Event. Com essa correção o código ficaria assim:
import flash.events.FullScreenEvent;

public class Main extends MovieClip {

//...

function suportaTelaCheia():Boolean {
//Verifica versao >= que 9.0.28
}

private function onStage(event:Event):void {
if( suportaTelaCheia() ) {
stage.addEventListener( FullScreenEvent.FULL_SCREEN, redrawFullScreen );
}
}

//...

function redrawFullScreen(event:Event):void {
if( event['fullScreen'] ) {
//Posicionar elementos para tela cheia
} else {
//Posicionar elementos para tamanho normal
}
}

//....

}
Repare que além de ter mudado a assinatura do método, mudei também o uso do objeto event. Isso foi feito porque a classe Event não possui o atributo fullScreen declarado, então utilizar event.fullScreen daria erro de compilação. Mas como sabemos que ali há este atributo, podemos utilizá-lo usando a notação event['fullScreen'].

Nenhum comentário:

Postar um comentário