flash - ¿Detecta si la pantalla completa está permitida en ActionScript 3.0?
actionscript-3 fullscreen (8)
Me gustaría eliminar un botón de pantalla completa si el parámetro allowfullscreen es falso.
param value="true" name="allowfullscreen"
¿Alguien sabe si es posible detectar ese valor? No viene con otros flashvars en loaderInfo.parameters.
El miembro que quieres es
stage.displayState
Se puede asignar así:
import flash.display.StageDisplayState;
....
stage.displayState = StageDisplayState.FULL_SCREEN;
stage.displayState = StageDisplayState.NORMAL;
Recomiendo leer:
[Editar:
Oh hombre, leí totalmente tu pregunta.]
Después de una pequeña prueba, parece que puedes usar el mecanismo de excepción para probarlo sin ningún parpadeo aceptable:
try
{
stage.displayState = StageDisplayState.FULL_SCREEN;
stage.displayState = StageDisplayState.NORMAL;
} catch ( error:SecurityError ) {
// your hide button code
}
No puede detectar si la inserción tiene allowfullscreen en false / true.
Desafortunadamente, tendrá que esperar hasta que el usuario haga clic en el botón para detectar el error final y, por lo tanto, deshabilitar el botón.
Aún así ... Debe estar en un contexto muy especial para requerir que Flashplayer evalúe este valor por sí mismo, ya que probablemente lo haya editado. En caso de que el embed sea manejado por un tercero que necesita poder decidir si el modo de pantalla completa debería permitirse o no. Si este es el caso, solo agrega una flash-var adicional (por ejemplo, fullscreenButton = false).
En realidad, los documentos no están claros sobre cómo se permite o no el modo de pantalla completa en ActionScript 3.
Lo único que mencionan es que si intenta cambiar al modo de pantalla completa y no está permitido, obtendrá una excepción que podrá capturar. Esto no le permitirá ocultar o mostrar un botón de modo de pantalla completa.
Puede haber una manera, pero los "livedocs" son notoriamente incompletos o breves.
Es posible que pueda leer el valor del parámetro de "pantalla completa" que tiene como valor predeterminado falso al observar los parámetros del objeto raíz con:
var keyStr:String;
var valueStr:String;
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
for (keyStr in paramObj) {
valueStr = String(paramObj[keyStr]);
//do something with this information
}
Editar: notaste que no vuelve en los flashvars.
El único método que puedo pensar sería llamar a una función de JavaScript a través de ExternalInterface. Puedes leer fácilmente los parámetros de incrustación flash desde JavaScript, pero estoy pensando que si pudieras insertar un JS en el HTML de tu película, hubieras cambiado el parámetro en lugar de tratar de averiguar qué es.
Aparte de eso, la solución de stage.displayState = StageDisplayState.FULL_SCREEN;
parece estar bien, aparte del hecho de que stage.displayState = StageDisplayState.FULL_SCREEN;
solo puede ser activado por un evento de usuario.
El modo de pantalla completa se inicia en respuesta a un clic del mouse o pulsación de tecla por parte del usuario; la película no puede cambiar Stage.displayState sin la intervención del usuario. ( http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/display/Stage.html#displayState )
Debería tener un segundo botón que, cuando se presiona, ejecute el código de Jotham. Buscaría un botón de inicio de sesión o cualquier otro botón que el usuario presione de todos modos.
Lamentablemente, la publicación anterior no funciona. Un swf con:
package {
import flash.display.Sprite;
import flash.display.StageDisplayState;
import flash.events.Event;
import flash.events.MouseEvent;
public class Tester extends Sprite {
public function Tester() {
trace("Display States: Full="+StageDisplayState.FULL_SCREEN+"; Normal="+StageDisplayState.NORMAL);
trace( "- Display State? "+stage.displayState);
trace( "- Full Screen Enabled? "+(stage.hasOwnProperty("displayState")) );
stage.addEventListener( MouseEvent.CLICK, function(evt:Event=null):void {
trace("Attempting to change to FullScreen...");
try {
stage.displayState = StageDisplayState.FULL_SCREEN;
trace("Success!");
stage.displayState = StageDisplayState.NORMAL;
} catch(e:*) {
trace("Fail! "+e);
}
});
}
}
}
Seguirá cuando FullScreen está deshabilitado:
Display States: Full=fullScreen; Normal=normal
- Display State? normal
- Full Screen Enabled? true
Attempting to change to FullScreen...
Fail! SecurityError: Error #2152: Full screen mode is not allowed.
El problema es la Full Screen Enabled? true
parte Full Screen Enabled? true
Creo que podríamos verificar esta capacidad con el intento de escuchar el
_root.stage.addEventListener(FullScreenEvent.FULL_SCREEN, onFullScreenListenter);
De mi prueba al tratar de permitir el modo de pantalla completa en un host de seguridad ajustado, devolverá una excepción nula. Supongo que debido a FullScreenEvent no existe.
EDITAR: Esto está obsoleto ahora (fue un truco para FP 8.5 / 9)
Lo siguiente detectará si su reproductor tiene disponibilidad de pantalla completa (thx @ mrdoob):
var hasFullscreen:Boolean = (stage.hasOwnProperty("displayState"))
SOLUCIÓN PARA AS3
puede verificar si la pantalla completa está permitida a través de las propiedades del escenario, ejemplo para mi caso
try {
if (btn.stage["allowsFullScreen"]) { // if this fails, then its not allowed
// do full screen allow code here
btn.alpha = 1; // show since its allowed
}
} catch (error:Error) { // full scrren not allowed
btn.alpha = 0.5; // dim since it cant be used
}