javascript - Aplicar la pantalla completa en la aplicación HTML de Adobe AIR
(2)
Prueba esto:
window.nativeWindow.stage.displayState = runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
window.nativeWindow.addEventListener(air.Event.ACTIVATE, function() {
if(window.nativeWindow.displayState === air.NativeWindowDisplayState.MINIMIZED) {
window.nativeWindow.stage.displayState = runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
}
});
window.nativeWindow.addEventListener(air.Event.DEACTIVATE, function() {
window.nativeWindow.minimize();
});
Para mi aplicación HTML AIR de Adobe, ejecuto lo siguiente al inicio para mostrar la ventana como pantalla completa:
window.nativeWindow.stage.displayState = runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
Y luego, para el estado de activación, hago:
window.nativeWindow.addEventListener(air.Event.ACTIVATE, function() {
window.nativeWindow.stage.displayState = runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
});
Entonces, la idea es que cuando la ventana se minimiza o desenfoca y luego se vuelve a enfocar, la ventana se hace a pantalla completa y nunca se abre en una ventana en un tamaño más pequeño.
Sin embargo, ACTIVAR incluso se dispara cuando hago clic en minimizar, por lo que la ventana no se puede minimizar.
¿Alguna idea de por qué? ¿O cómo solucionar esto? Me he dado cuenta de que si comento esa línea, cuando minimizo en modo de pantalla completa, primero hace que la ventana ''ventana'', por ejemplo, a 800x600 el tamaño del conjunto en el archivo XML antes de minimizarlo ... así que me pregunto si es ahí donde problema es mentira? Que realmente activa la ventana haciendo ese paso para ir al modo minimizado.
¿Alguna otra sugerencia para asegurarse de que la aplicación entre en pantalla completa cuando se restaure desde un estado minimizado?
El segundo problema es hacer que la ventana sea visible y no visible cuando está activa o desactivada usando:
window.nativeWindow.addEventListener(air.Event.ACTIVATE, function() {
window.nativeWindow.visible = true;
});
window.nativeWindow.addEventListener(air.Event.DEACTIVATE, function() {
window.nativeWindow.visible = false;
});
La idea es que, como la aplicación está en pantalla completa, si el usuario se aleja de ella o minimiza la ventana, debe ocultarla para que no pueda verse detrás de otras ventanas (ya que Adobe AIR usa Flash Player para lograr el pantalla completa)
El problema aquí, es que la ventana nunca vuelve a ser visible cuando ALT-Tab o CMD-Tab van a la ventana después de salir de la ventana y hacen que su visble sea falso. Tampoco cambia los estados de visibilidad cuando se minimiza o maximiza la ventana, pero SÍ activa el evento de activación y desactivación. Me pregunto si esto se debe a la animación de Mac OS X en minimizar?
¿Alguna idea sobre cómo solucionar estos dos problemas?
¿Hay una alternativa a visible para ocultar o mostrar la ventana? CSS Display ¡Ninguno no es una opción!
¿Y por qué se activa el evento de activación cuando minimizo la ventana que causa el bucle infinito de la pantalla completa?
De acuerdo, estoy publicando esto como una solución de trabajo actual en Windows 7 (sin responder la pregunta que solo muestra el progreso actual) en función de lo que Paul Facklam publicó a continuación, verificando el estado normal de la pantalla en lugar de minimizarla y mezclándola con algunas funciones adicionales para hacer que la ventana llene los límites de la pantalla y centrarla.
function centerWindow(instance){
//default bounds of nativeWindow
var applicationBounds = instance.nativeWindow.bounds;
//determine which screen we''re located on
var screens = air.Screen.getScreensForRectangle(instance.nativeWindow.bounds);
var screenBounds = (screens.length > 0) ? screens[0].visibleBounds : air.Screen.mainScreen.visibleBounds;
//get initial position
x = (screenBounds.width - applicationBounds.width) / 2;
y = (screenBounds.height - applicationBounds.height) / 2;
//adjust for offset x or offset y (multi monitors)
x = screenBounds.x + x;
y = screenBounds.y + y;
instance.nativeWindow.x = x;
instance.nativeWindow.y = y;
}
function resizeWindow(instance) {
//default bounds of nativeWindow
var applicationBounds = instance.nativeWindow.bounds;
//determine which screen we''re located on
var screens = air.Screen.getScreensForRectangle(instance.nativeWindow.bounds);
var screenBounds = (screens.length > 0) ? screens[0].visibleBounds : air.Screen.mainScreen.visibleBounds;
//set the window widths and height to window (this so the aero peak doesn''t show a small window)
instance.nativeWindow.width = screenBounds.width;
instance.nativeWindow.height = screenBounds.height;
//then center the window
centerWindow(instance);
}
$(document).ready(function() {
//resize the window on load
resizeWindow(window);
//make window fullscreen
window.nativeWindow.stage.displayState = runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
//make sure it''s visible (if not already)
window.nativeWindow.visible = true;
//if window is activated and display is normal i.e. NOT fullscreen, make it fullscreen
window.nativeWindow.addEventListener(air.Event.ACTIVATE, function() {
if(window.nativeWindow.displayState == ''normal'') {
window.nativeWindow.stage.displayState = runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
}
});
//if window is unfocused then minimize to the taskbar or dock
window.nativeWindow.addEventListener(air.Event.DEACTIVATE, function() {
window.nativeWindow.minimize(); // minimizes the window
});
});
Todavía no tuve la oportunidad de probar esto en Mac OS X, pero parece que OS X trata los eventos ACTIVAR y DESACTIVAR de forma diferente ... en función de los experimentos previos que he probado.
Puede confirmar que este problema está en Mac OS X! Y funciona bien en Windows. Así que parece que la forma en que el dock anima las ventanas hace que los eventos se disparen torpemente causando bucles, etc.
¿Alguien más tenía problemas con estos eventos en Mac OS X para AIR?
Actualización : me pregunto si usar:
if(event.afterDisplayState == air.NativeWindowDisplayState.MINIMIZED)
Ayudaría a resolver el problema de OS X (lo probaré esta noche).
Una posible solución para solucionar el problema de OS X es hacer lo siguiente:
if (air.Capabilities.os.indexOf("Mac OS") > -1) {
var firstRun = false;
window.nativeWindow.addEventListener(air.Event.DEACTIVATE, function() {
if(firstRun) {
air.trace(''DEACTIVATE'');
} else {
firstRun = true;
}
});
} else {
window.nativeWindow.addEventListener(air.Event.DEACTIVATE, function() {
air.trace(''DEACTIVATE'');
});
}
Por lo tanto, básicamente ignora la primera llamada extraña de DEACTIVATE si OS X se está utilizando ... y luego trata con lo normal. ¡Aunque esto se siente como un feo hack horrible!