Zarządzanie oknamiAdobe AIR 1.0 i wersje późniejsze Właściwości i metody klasy NativeWindow służą do zarządzania wyglądem, zachowaniem i cyklem życia okien pulpitu. Uwaga: W przypadku korzystania z architektury Flex z reguły lepiej jest zarządzać zachowaniem okien przy użyciu klas architektury. Dostęp do większości właściwości i metod klasy NativeWindow można uzyskać poprzez klasy mx:WindowedApplication i mx:Window.
Pobieranie wystąpienia klasy NativeWindowAby manipulować oknem, należy najpierw pobrać instancję okna. Instancję okna można pobrać z jednego z następujących miejsc:
Ponieważ obiekty Application, mx:WindowedApplication i mx:Window środowiska Flex są obiektami wyświetlanymi, programista może w łatwy sposób odwołać się do okna aplikacji w pliku MXML za pomocą właściwości stage, co ilustruje poniższy przykład: <?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();">
<mx:Script>
<![CDATA[
import flash.display.NativeWindow;
public function init():void{
var appWindow:NativeWindow = this.stage.nativeWindow;
//set window properties
appWindow.visible = true;
}
]]>
</mx:Script>
</WindowedApplication
Uwaga: Dopóki składnik WindowedApplication lub Window nie zostanie dodany na stół montażowy okna przez środowisko Flex, właściwość stage składnika ma wartość null. To zachowanie jest zgodne z zachowaniem składnika Application środowiska Flex, ale oznacza, że nie jest możliwy dostęp do stołu montażowego lub instancji NativeWindow w detektorach dla zdarzeń, które występują wcześniej w cyklu inicjowania składników WindowedApplication i Window, takich jak np. creationComplete. Dostęp do stołu montażowego i instancji NativeWindow jest bezpieczny, gdy wywołane zostanie zdarzenie applicationComplete.
Aktywowanie, wyświetlanie i ukrywanie okienAby aktywować okno, należy wywołać metodę activate() NativeWindow. Aktywowanie okna przenosi okno na wierzch i przypisuje mu obszar aktywności dla klawiatury i myszy oraz, jeśli zachodzi taka konieczność, spowoduje, że okno stanie się widoczne, przywracając okno lub ustawiając właściwość visible na wartość true. Aktywowanie okna nie zmienia kolejności pozostałych okien w aplikacji. Wywołanie metody activate() powoduje, że okno wywołuje zdarzenie activate. Aby wyświetlić ukryte okno, nie aktywując go, należy ustawić właściwość visible na wartość true. Spowoduje to przeniesienie okna na wierzch, ale nie przypisze do niego obszaru aktywności. Aby ukryć okno, należy ustawić jego właściwość visible na wartość false. Ukrycie okna blokuje wyświetlanie obu elementów: okna oraz powiązanych ikon paska zadań oraz (w systemie Mac OS X) wpisu w menu Okno. Podczas zmieniania widoczności okna zmienia się również widoczność wszystkich okien, których dane okno jest właścicielem. Na przykład w przypadku ukrycia okna są również ukrywane wszystkie okna, których okno jest właścicielem. Uwaga: W systemie Mac OS X nie jest możliwe pełne ukrycie zminimalizowanego okna, które ma ikonę w części okna Docku. Jeśli właściwość visible ma wartość false dla zminimalizowanego okna, ikona Docku okna jest wciąż wyświetlana. Jeśli użytkownik kliknie ikonę, okno zostanie przywrócone i wyświetlone ponownie.
Zmiana kolejności wyświetlania oknaŚrodowisko AIR dostarcza kilka metod do bezpośredniej zmiany kolejności wyświetlania okien. Programista może przesuwać okno na wierzch lub pod spód kolejności wyświetlania; możliwe jest również przesunięcie przed lub za inne okno. W tym samym czasie użytkownik może ponownie ustawić kolejność okien, aktywując je. Okno można zachować na wierzchu w stosunku do pozostałych okien, ustawiając jego właściwość alwaysInFront na wartość true. Jeśli więcej niż jedno okno ma to ustawienie, wówczas kolejność wyświetlania dla tych okien jest określana między nimi, ale sortowanie wykonywane jest zawsze nad oknami, dla których we właściwości alwaysInFront ustawiona została wartość false. Okna w grupie na samym wierzchu wyświetlane są również nad oknami w innych aplikacjach, nawet jeśli aplikacja AIR nie jest aktywna. Ponieważ to zachowanie może zakłócać pracę użytkownika, ustawienie właściwości alwaysInFront na wartość true powinno być używane tylko, jeśli jest konieczne i odpowiednie. Przykłady uzasadnionych zastosowań obejmują:
Uwaga: Środowisko AIR nie narzuca właściwego używania właściwości alwaysInFront. Jeśli jednak aplikacja zakłóci pracę użytkownika, prawdopodobnie aplikacja ta wyląduje w jego koszu.
Jeśli okno posiada inne okna, te okna są zawsze umieszczane przed nim. Wywołanie funkcji orderToFront() lub ustawienie dla właściwości alwaysInFront wartości true dla okna posiadającego inne okna spowoduje umieszczenie posiadanych okien wraz z oknem głównym przed innymi oknami, ale posiadane okna będą nadal wyświetlane przed oknem głównym. Wywoływanie metod zmiany kolejności okien względem posiadanych okien działa normalnie między oknami posiadanymi przez to samo okno, ale może również doprowadzić do zmiany kolejności całej grupy posiadanych okien względem okien spoza tej grupy. Na przykład po wywołaniu klasy orderToFront() dla posiadanego okna spowoduje, że to okno, jego właściciel oraz wszystkie okna posiadane przez tego samego właściciela zostaną przesunięte do przodu w kolejności wyświetlania. Klasa NativeWindow dostarcza następujących właściwości i metod do ustawiania kolejności wyświetlania okna względem innych okien:
Uwaga: Jeśli okno jest ukryte (właściwość visible ma wartość false) lub zminimalizowane, wówczas wywołanie metod dotyczących kolejności wyświetlania nie przynosi żadnego efektu.
W systemie operacyjnym Linux różne menedżery okien wymuszają różne zasady w zależności od kolejności wyświetlania okien:
Zamykanie oknaAby zamknąć okno, należy użyć metody NativeWindow.close(). Zamknięcie okna powoduje wyładowanie treści okna, ale jeśli inne obiekty mają odwołania do tej treści, obiekty treści nie zostaną zniszczone. Metoda NativeWindow.close() wykonywana jest asynchronicznie; aplikacja zawarta w oknie kontynuuje działanie podczas procesu zamykania. Metoda close wywołuje zdarzenie close, gdy operacja zamykania zostanie zakończona. Obiekt NativeWindow pozostaje technicznie prawidłowy, ale dostęp do większości właściwości i metod zamkniętego okna generuje błąd IllegalOperationError. Nie można ponownie otworzyć zamkniętego okna. Aby przeprowadzić test, czy okno zostało zamknięte, należy sprawdzić właściwość closed okna. Aby ukryć okno, należy ustawić właściwość NativeWindow.visible na wartość false. Jeśli właściwość Nativeapplication.autoExit ma wartość true (sytuacja domyślna), wówczas aplikacja zakończy działanie, gdy zamknięte zostanie jej ostatnie okno. Wszystkie okna posiadane przez inne okna zostają zamknięte w momencie zamknięcia okna głównego. Posiadane okna nie wywołują zdarzenia closing, dlatego nie można zapobiec ich zamknięciu. Zostaje wywołane zdarzenie close. Zezwalanie na anulowanie operacji oknaJeśli okno korzysta z karnacji systemowej, interakcja użytkownika z oknem może zostać anulowana przez wykrywanie i anulowanie domyślnego zachowania odpowiednich zdarzeń. Na przykład: jeśli użytkownik kliknie przycisk zamykania karnacji systemowej, wywołane zostanie zdarzenie closing. Jeśli dowolny zarejestrowany detektor wywoła metodę preventDefault() zdarzenia, wówczas okno nie zostanie zamknięte. Jeśli okno nie korzysta z karnacji systemowej, zdarzenia powiadomień dla zamierzonych zmian nie są automatycznie wywoływane przed dokonaniem zmiany. W skutek tego, jeśli wywołane zostaną metody w celu zamknięcia okna, zmiany jego stanu lub ustawienia dowolnej właściwości obwiedni, zmiany nie można anulować. Aby powiadomić składniki w aplikacji przed zmianą okna, logika aplikacji może wywołać stosowane zdarzenie powiadomienia za pomocą metody dispatchEvent() okna. Na przykład: poniższa logika implementuje moduł obsługi zdarzenia cancelable dla przycisku zamykania okna: public function onCloseCommand(event:MouseEvent):void{
var closingEvent:Event = new Event(Event.CLOSING,true,true);
dispatchEvent(closing);
if(!closingEvent.isDefaultPrevented()){
win.close();
}
}
Metoda dispatchEvent() zwraca wartość false, jeśli metoda preventDefault() zdarzenia wywoływana jest przez detektor. Możne jednak zwrócić również wartość false z innych powodów, dlatego lepszym rozwiązaniem jest jawne użycie metody isDefaultPrevented() w celu przetestowania, czy zmianę należy anulować. Maksymalizowanie, minimalizowanie i przywracanie oknaAby zmaksymalizować okno, należy użyć metody maximize() klasy NativeWindow. myWindow.maximize(); Aby zminimalizować okno, należy użyć metody minimize() klasy NativeWindow. myWindow.minimize(); Aby przywrócić okno (tj. powrócić do rozmiaru przed minimalizacją lub maksymalizacją), należy użyć metody restore() klasy NativeWindow. myWindow.restore(); Okno, które ma właściciela, jest minimalizowane i przywracane, gdy jest minimalizowane i przywracane okno główne. Podczas minimalizowania posiadane okno nie wywołuje żadnych zdarzeń, ponieważ to okno główne jest minimalizowane. Uwaga: Zachowanie wynikające z maksymalizacji okna środowiska AIR jest różne od standardowego zachowania w systemie Mac OS X. Zamiast przełączania między „standardowym” rozmiarem zdefiniowanym przez aplikację a rozmiarem ostatnio ustawionym przez użytkownika, okna środowiska AIR przełączają się między rozmiarem ostatnio ustawionym przez aplikację lub użytkownika i pełnym dostępnym obszarem ekranu.
W systemie operacyjnym Linux różne menedżery okien wymuszają różne zasady w zależności od ustawienia stanu wyświetlania okien:
Uwaga: W systemie Linux właściwości okna są zmieniane asynchronicznie. Jeśli autor aplikacji zmieni stan wyświetlania w jednym wierszu programu i odczyta wartość w następnym, odczyt wartości będzie nadal odzwierciedlał stare ustawienie. Na wszystkich platformach obiekt NativeWindow wywołuje zdarzenie displayStateChange po zmianie stanu wyświetlania. Jeśli zachodzi potrzeba wykonania określonego działania na podstawie nowego stanu okna, należy zawsze robić to w podprogramie obsługi zdarzenia displayStateChange. Patrz Wykrywanie zdarzeń okien.
Przykład: minimalizowanie, maksymalizowanie, przywracanie i zamykanie oknaPoniższa krótka aplikacja MXML przedstawia metody maximize(), minimize(), restore() i close() klasy Window: <?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical">
<mx:Script>
<![CDATA[
public function minimizeWindow():void
{
this.stage.nativeWindow.minimize();
}
public function maximizeWindow():void
{
this.stage.nativeWindow.maximize();
}
public function restoreWindow():void
{
this.stage.nativeWindow.restore();
}
public function closeWindow():void
{
this.stage.nativeWindow.close();
}
]]>
</mx:Script>
<mx:VBox>
<mx:Button label="Minimize" click="minimizeWindow()"/>
<mx:Button label="Restore" click="restoreWindow()"/>
<mx:Button label="Maximize" click="maximizeWindow()"/>
<mx:Button label="Close" click="closeWindow()"/>
</mx:VBox>
</mx:WindowedApplication>
Poniższy przykład kodu ActionScript dla treści Flash tworzy cztery pola tekstowe, które można kliknąć i które wywołują metody minimize(), maximize(), restore() i close() klasy NativeWindow: package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
public class MinimizeExample extends Sprite
{
public function MinimizeExample():void
{
var minTextBtn:TextField = new TextField();
minTextBtn.x = 10;
minTextBtn.y = 10;
minTextBtn.text = "Minimize";
minTextBtn.background = true;
minTextBtn.border = true;
minTextBtn.selectable = false;
addChild(minTextBtn);
minTextBtn.addEventListener(MouseEvent.CLICK, onMinimize);
var maxTextBtn:TextField = new TextField();
maxTextBtn.x = 120;
maxTextBtn.y = 10;
maxTextBtn.text = "Maximize";
maxTextBtn.background = true;
maxTextBtn.border = true;
maxTextBtn.selectable = false;
addChild(maxTextBtn);
maxTextBtn.addEventListener(MouseEvent.CLICK, onMaximize);
var restoreTextBtn:TextField = new TextField();
restoreTextBtn.x = 230;
restoreTextBtn.y = 10;
restoreTextBtn.text = "Restore";
restoreTextBtn.background = true;
restoreTextBtn.border = true;
restoreTextBtn.selectable = false;
addChild(restoreTextBtn);
restoreTextBtn.addEventListener(MouseEvent.CLICK, onRestore);
var closeTextBtn:TextField = new TextField();
closeTextBtn.x = 340;
closeTextBtn.y = 10;
closeTextBtn.text = "Close Window";
closeTextBtn.background = true;
closeTextBtn.border = true;
closeTextBtn.selectable = false;
addChild(closeTextBtn);
closeTextBtn.addEventListener(MouseEvent.CLICK, onCloseWindow);
}
function onMinimize(event:MouseEvent):void
{
this.stage.nativeWindow.minimize();
}
function onMaximize(event:MouseEvent):void
{
this.stage.nativeWindow.maximize();
}
function onRestore(event:MouseEvent):void
{
this.stage.nativeWindow.restore();
}
function onCloseWindow(event:MouseEvent):void
{
this.stage.nativeWindow.close();
}
}
}
Zmiana rozmiaru i przesuwanie oknaJeśli okno korzysta z karnacji systemowej, karnacja dostarcza elementów sterowania przeciąganiem do zmiany rozmiaru okna i przesuwania po pulpicie. Jeśli okno nie korzysta z karnacji systemowej, należy dodać własne elementy sterowania, aby zezwolić użytkownikowi na zmianę rozmiaru i przesuwanie okna. Uwaga: Aby zmienić rozmiar lub przesunąć okno, należy najpierw uzyskać odwołanie do instancji NativeWindow. Informacje na temat tego, w jaki sposób uzyskać odwołanie okna, zawiera sekcja Pobieranie wystąpienia klasy NativeWindow.
Zmiana rozmiaru oknaAby umożliwić użytkownikowi interaktywne zmienianie rozmiaru okna, należy użyć metody startResize() obiektu NativeWindow. Jeśli metoda zostanie wywołana ze zdarzenia mouseDown, operacja zmiany rozmiaru będzie sterowana przez mysz i zakończy się w momencie odebrania przez system operacyjny zdarzenia mouseUp. W momencie wywołania metody startResize() należy przekazać argument, który określa krawędź lub róg, z którego dokonywana będzie zmiana rozmiaru okna. Aby programowo ustawić rozmiar okna, należy ustawić właściwości width, height lub bounds okna na żądane wymiary. Podczas ustawiania obwiedni rozmiar i położenie okna mogą być zmieniane w tym samym czasie. Jednak kolejność występowania zmian nie jest zagwarantowana. Niektóre menedżery okien systemu Linux nie zezwalają, aby okna wykraczały poza granice pulpitu (ekranu). W tych przypadkach końcowy rozmiar okna może być ograniczony z powodu kolejności w jakiej są ustawiane właściwości, mimo że łącznie wszystkie zmiany „netto” doprowadziłyby do uzyskania poprawnego okna. Na przykład, jeśli zostanie zmieniona wysokość i położenie y okna u dołu ekranu, wówczas zmiana wysokości na pełną może nie nastąpić, jeśli zmiana wysokości zostanie zastosowana przez zmianą położenia y. Uwaga: W systemie Linux właściwości okna są zmieniane asynchronicznie. Jeśli autor aplikacji zmieni wielkość okna w jednym wierszu programu i odczyta wymiary w następnym, odczyt wartości będzie nadal odzwierciedlał stare ustawienie. Na wszystkich platformach obiekt NativeWindow wywołuje zdarzenie resize po zmianie wymiarów okna. Jeśli konieczne jest podjęcie określonego działania, np. rozmieszczenie elementów sterujących w oknie, na podstawie nowej wielkości lub stanu okna, należy zawsze robić to w podprogramie obsługi zdarzenia resize. Patrz Wykrywanie zdarzeń okien.
Tryb skalowania stołu montażowego określa sposób zachowania stołu montażowego okna i jego treści w chwili zmiany rozmiaru okna. Należy pamiętać, że tryby skalowania stołu montażowego zostały zaprojektowane do obsługi sytuacji (np. w przeglądarkach internetowych), w których aplikacja nie steruje rozmiarem lub proporcją jej obszaru wyświetlania. Na ogół najlepsze wyniki uzyskiwane są przez ustawienie właściwości scaleMode stołu montażowego na wartość StageScaleMode.NO_SCALE. Jeśli zajdzie konieczność przeskalowania treści okna, można ustawić parametry treści scaleX i scaleY w odpowiedzi na zmiany obwiedni okna. Przesuwanie oknaAby przesunąć okno, nie zmieniając jego rozmiaru, należy użyć metody startMove() klasy NativeWindow. Podobnie jak w przypadku metody startResize(), w razie wywołania metody startMove() ze zdarzenia mouseDown proces przesuwania jest sterowany myszą i jest kończony w momencie wykrycia zdarzenia mouseUp przez system operacyjny. Więcej informacji o metodach startResize() i startMove() zawiera Skorowidz języka ActionScript 3.0 dla platformy Adobe Flash. Aby programowo przesunąć okno, należy nadać odpowiednie wartości jego właściwościom x, y lub bounds. Podczas ustawiania obwiedni rozmiar i położenie okna mogą być zmieniane w tym samym czasie. Uwaga: W systemie Linux właściwości okna są zmieniane asynchronicznie. Jeśli autor aplikacji przeniesie okno w jednym wierszu programu i odczyta położenie w kolejnym, odczyt wartości będzie nadal odzwierciedlał stare ustawienie. Na wszystkich platformach obiekt NativeWindow wywołuje zdarzenie move po zmianie pozycji. Jeśli zachodzi potrzeba wykonania określonego działania na podstawie nowej pozycji okna, należy zawsze robić to w podprogramie obsługi zdarzenia move. Patrz Wykrywanie zdarzeń okien.
Przykład: Zmienianie rozmiarów i przesuwanie okienPoniższy przykład przedstawia sposób, w jaki inicjowane są operacje zmiany rozmiaru i przesuwania dla okna: package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.NativeWindowResize;
public class NativeWindowResizeExample extends Sprite
{
public function NativeWindowResizeExample():void
{
// Fills a background area.
this.graphics.beginFill(0xFFFFFF);
this.graphics.drawRect(0, 0, 400, 300);
this.graphics.endFill();
// Creates a square area where a mouse down will start the resize.
var resizeHandle:Sprite =
createSprite(0xCCCCCC, 20, this.width - 20, this.height - 20);
resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartResize);
// Creates a square area where a mouse down will start the move.
var moveHandle:Sprite = createSprite(0xCCCCCC, 20, this.width - 20, 0);
moveHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartMove);
}
public function createSprite(color:int, size:int, x:int, y:int):Sprite
{
var s:Sprite = new Sprite();
s.graphics.beginFill(color);
s.graphics.drawRect(0, 0, size, size);
s.graphics.endFill();
s.x = x;
s.y = y;
this.addChild(s);
return s;
}
public function onStartResize(event:MouseEvent):void
{
this.stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT);
}
public function onStartMove(event:MouseEvent):void
{
this.stage.nativeWindow.startMove();
}
}
}
|
|