Na urządzeniach przenośnych klasa
StageWebView
wyświetla zawartość HTML przy użyciu elementu sterującego przeglądarki systemowej. Na komputerach stacjonarnych jest stosowany standardowy element sterujący Adobe® AIR® HTMLLoader. Odczytując właściwość
StageWebView.isSupported
, można sprawdzić, czy ta klasa jest obsługiwana na bieżącym urządzeniu. Obsługa tej klasy nie jest gwarantowana dla wszystkich urządzeń z profilami urządzeń przenośnych.
Klasa StageWebView oferuje we wszystkich profilach tylko ograniczone opcje interakcji między zawartością HTML a pozostałymi elementami aplikacji. Pozwala sterować nawigacją, ale nie pozwala bezpośrednio wymieniać danych ani stosować skryptów wychodzących poza domenę. Umożliwia wczytywanie zawartości z lokalnego lub zdalnego adresu URL lub przekazywanie jej w ciągu kodu HTML.
Obiekty StageWebView
Klasa StageWebView nie jest obiektem ekranowym. Nie można dodać takiego obiektu do listy wyświetlania. Obiekt taki działa jak widok dołączony bezpośrednio do stołu montażowego. Zawartość obiektu StageWebView jest rysowana przed każdą zawartością z listy wyświetlania (zasłania ją). Nie ma możliwości sterowania kolejnością (głębokością) w przypadku wielu obiektów StageWebView.
Aby wyświetlić obiekt StageWebView, należy przypisać stół montażowy, na którym ma zostać wyświetlony ten obiekt, do właściwości
stage
tego obiektu StageWebView. Właściwość
viewPort
pozwala ustawić rozmiar wyświetlanego obiektu.
Współrzędne ustawione we właściwości
viewPort
powinny należeć do zakresu od –8192 do 8191. Maksymalna wartość szerokości i wysokość stołu montażowego wynosi 8191. Jeżeli wymiary przekroczą wartości maksymalne, zostanie wygenerowany wyjątek.
Poniższy przykładowy kod tworzy obiekt StageWebView, ustawia właściwości
stage
i
viewPort
oraz wyświetla ciąg HTML.
var webView:StageWebView = new StageWebView();
webView.viewPort = new Rectangle( 0, 0, this.stage.stageWidth, this .stage.stageHeight);
webView.stage = this.stage;
var htmlString:String = "<!DOCTYPE HTML>" +
"<html><body>" +
"<p>King Philip could order five good steaks.</p>" +
"</body></html>";
webView.loadString( htmlString );
Aby ukryć obiekt StageWebView, należy ustawić wartość
null
dla właściwości
stage
. Aby całkowicie zniszczyć obiekt, należy wywołać metodę
dispose()
. Wywołanie metody
dispose()
jest opcjonalne, jednak pozwala procesowi czyszczenia pamięci szybciej odzyskać pamięć używaną przez obiekt.
Zawartość
Zawartość można wczytywać do obiektu StageWebView przy użyciu dwóch metod:
loadURL()
i
loadString()
.
Metoda
loadURL()
wczytuje zasób o określonym adresie URL. Można użyć schematu URI obsługiwanego przez element sterujący przeglądarki systemowej, na przykład data:, file:, http:, https: lub javascript:. Schematy app: i app-storage: nie są obsługiwane. Środowisko AIR nie sprawdza poprawności ciąg adresu URL.
Metoda
loadString()
wczytuje ciąg literału z zawartością HTML. Sposób wyrażania lokalizacji strony wczytywanej tą metodą:
-
Na komputerach stacjonarnych: about:blank
-
W systemie iOS:
htmlString
-
W systemie Android: format URI danych zakodowanej wartości
htmlString
Schemat URI określa reguły wczytywania zawartości osadzonej lub danych osadzonych.
Schemat URI
|
Wczytywanie zasobu lokalnego
|
Wczytywanie zasobu zdalnego
|
Lokalne żądanie XMLHttpRequest
|
Zdalne żądanie XMLHttpRequest
|
data:
|
Nie
|
Tak
|
Nie
|
Nie
|
file:
|
Tak
|
Tak
|
Tak
|
Tak
|
http:, https:
|
Nie
|
Tak
|
Nie
|
W tej samej domenie
|
about: (metoda loadString())
|
Nie
|
Tak
|
Nie
|
Nie
|
Uwaga:
Jeśli właściwość
displayState
stołu montażowego jest ustawiona na
FULL_SCREEN
, to na komputerze stacjonarnym nie można wpisywać tekstu w polu tekstowym wyświetlanym w obiekcie StageWebView. W systemie iOS lub Android można pisać w polu tekstowym obiektu StageWebView nawet wtedy, gdy właściwość
displayState
stołu montażowego ma wartość
FULL_SCREEN
.
W poniższym przykładzie użyto obiektu StageWebView do wyświetlenia witryny firmy Adobe.
package {
import flash.display.MovieClip;
import flash.media.StageWebView;
import flash.geom.Rectangle;
public class StageWebViewExample extends MovieClip{
var webView:StageWebView = new StageWebView();
public function StageWebViewExample() {
webView.stage = this.stage;
webView.viewPort = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight );
webView.loadURL( "http://www.adobe.com" );
}
}
}
Aby aplikacja mogła pomyślnie wczytywać zasoby zdalne na urządzeniach z systemem Android, należy określić funkcjonujące w tym systemie uprawnienie INTERNET.
W systemie Android 3.0 lub nowszym aplikacja musi włączyć przyspieszanie sprzętowe w elemencie manifestAdditions systemu Android umieszczonym w deskryptorze aplikacji AIR, aby móc wyświetlać zawartość dodatku plug-in w obiekcie StageWebView. Więcej informacji zawiera temat
Włączanie programu Flash Player i innych dodatków plug-in w obiekcie StageWebView
.
Identyfikator URI języka JavaScript
Korzystając z identyfikatora URI języka JavaScript, można wywołać funkcję zdefiniowaną na stronie HTML wczytanej przez obiekt StageWebView. Funkcja wywołana przy użyciu identyfikatora URI języka JavaScript jest uruchamiana w kontekście wczytanej strony internetowej. W poniższym przykładzie użyto obiektu StageWebView, aby wywołać funkcję JavaScript.
package {
import flash.display.*;
import flash.geom.Rectangle;
import flash.media.StageWebView;
public class WebView extends Sprite
{
public var webView:StageWebView = new StageWebView();
public function WebView()
{
var htmlString:String = "<!DOCTYPE HTML>" +
"<html><script type=text/javascript>" +
"function callURI(){" +
"alert(\"You clicked me!!\");"+
"}</script><body>" +
"<p><a href=javascript:callURI()>Click Me</a></p>" +
"</body></html>";
webView.stage = this.stage;
webView.viewPort = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight );
webView.loadString( htmlString );
}
}
}
Zdarzenia nawigacji
Gdy użytkownik klika łącze w zawartości HTML, obiekt StageWebView wyzwala zdarzenie
locationChanging
. Istnieje możliwość wywołania metody
preventDefault()
obiektu zdarzenia w celu anulowania nawigacji. Jeśli tak się nie stanie, obiekt StageWebView przejdzie do nowej strony i wywoła zdarzenie
locationChange
. Po zakończeniu wczytywania strony obiekt StageWebView wyzwala zdarzenie
complete
.
Zdarzenie
locationChanging
jest wywoływane przy każdym przekierowaniu HTML. Zdarzenia
locationChange
i
complete
są wywoływane we właściwych momentach.
W systemie iOS zdarzenie
locationChange
jest wyzwalane przed zdarzeniem
locationChanging
. Wyjątki stanowią metody
loadURL(
) i
loadString()
. Zdarzenie
locationChange
jest również wywoływane w przypadku zmian związanych z nawigacją w przypadku obiektów iFrame oraz Frame.
Poniższy przykład ilustruje, jak zapobiec zmianie lokalizacji i zamiast tego otworzyć nową stronę w przeglądarce systemowej.
package {
import flash.display.MovieClip;
import flash.media.StageWebView;
import flash.events.LocationChangeEvent;
import flash.geom.Rectangle;
import flash.net.navigateToURL;
import flash.net.URLRequest;
public class StageWebViewNavEvents extends MovieClip{
var webView:StageWebView = new StageWebView();
public function StageWebViewNavEvents() {
webView.stage = this.stage;
webView.viewPort = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight );
webView.addEventListener( LocationChangeEvent.LOCATION_CHANGING, onLocationChanging );
webView.loadURL( "http://www.adobe.com" );
}
private function onLocationChanging( event:LocationChangeEvent ):void
{
event.preventDefault();
navigateToURL( new URLRequest( event.location ) );
}
}
}
Historia
Jeśli użytkownik kliknie w zawartości wyświetlanej w obiekcie StageWebView, element sterujący zapisze stosy historii dotyczące poprzednich i następnych operacji. Poniższy przykład ilustruje sposób przechodzenia między tymi dwoma stosami historii. W przykładzie użyto przycisków programowych Wstecz i Szukaj.
package {
import flash.display.MovieClip;
import flash.media.StageWebView;
import flash.geom.Rectangle;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class StageWebViewExample extends MovieClip{
var webView:StageWebView = new StageWebView();
public function StageWebViewExample()
{
webView.stage = this.stage;
webView.viewPort = new Rectangle( 0, 0, stage.stageWidth, stage.stageHeight );
webView.loadURL( "http://www.adobe.com" );
stage.addEventListener( KeyboardEvent.KEY_DOWN, onKey );
}
private function onKey( event:KeyboardEvent ):void
{
if( event.keyCode == Keyboard.BACK && webView.isHistoryBackEnabled )
{
trace("back");
webView.historyBack();
event.preventDefault();
}
if( event.keyCode == Keyboard.SEARCH && webView.isHistoryForwardEnabled )
{
trace("forward");
webView.historyForward();
}
}
}
}
Aktywność
Obiekt StageWebView nie jest obiektem ekranowym, jednak klasa ta zawiera elementy umożliwiające zarządzanie zmianami aktywności — przejmowaniem i zwalnianiem punktu skupienia — przez element sterujący.
Gdy obiekt StageWebView staje się aktywny, wywołuje zdarzenie
focusIn
. To zdarzenie umożliwia kontrolowanie elementów funkcjonujących jako punkty skupienia w aplikacji, jeśli jest to konieczne.
Gdy obiekt StageWebView przestaje być aktywny (zwalania punkt skupienia), wywołuje zdarzenie
focusOut
. Wystąpienie klasy StageWebView może zwolnić punkt skupienia, gdy użytkownik przejdzie poza pierwszy lub ostatni element sterujący na stronie internetowej, korzystając z trackballa lub strzałek urządzenia. Właściwość
direction
obiektu zdarzenia wskazuje, czy punkt skupienia wyszedł poza stronę w górę, czy w dół. Korzystając z tych informacji, należy uaktywnić odpowiedni obiekt ekranowy powyżej lub poniżej obiektu StageWebView.
W systemie iOS nie można programowo kontrolować aktywności. Obiekt StageWebView wywołuje zdarzenia
focusIn
i
focusOut
z właściwością direction obiektu
FocusEvent
ustawioną na
none
. Gdy użytkownik dotyka ekranu w obrębie obiektu StageWebView, jest wywoływane zdarzenie
focusIn
. Gdy użytkownik dotyka ekranu poza obiektem StageWebView, jest wywoływane zdarzenie
focusOut
.
Poniższy przykład ilustruje przekazywanie punktu skupienia z obiektu StageWebView do obiektów ekranowych programu Flash.
package {
import flash.display.MovieClip;
import flash.media.StageWebView;
import flash.geom.Rectangle;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.FocusEvent;
import flash.display.FocusDirection;
import flash.events.LocationChangeEvent;
public class StageWebViewFocusEvents extends MovieClip{
var webView:StageWebView = new StageWebView();
var topControl:TextField = new TextField();
var bottomControl:TextField = new TextField();
public function StageWebViewFocusEvents()
{
trace("Starting");
topControl.type = TextFieldType.INPUT;
addChild( topControl );
topControl.height = 60;
topControl.width = stage.stageWidth;
topControl.background = true;
topControl.text = "One control on top.";
topControl.addEventListener( FocusEvent.FOCUS_IN, flashFocusIn );
topControl.addEventListener( FocusEvent.FOCUS_OUT, flashFocusOut );
webView.stage = this.stage;
webView.viewPort = new Rectangle( 0, 60, stage.stageWidth, stage.stageHeight
- 120 );
webView.addEventListener( FocusEvent.FOCUS_IN, webFocusIn );
webView.addEventListener(FocusEvent.FOCUS_OUT, webFocusOut );
webView.addEventListener(LocationChangeEvent.LOCATION_CHANGING,
function( event:LocationChangeEvent ):void
{
event.preventDefault();
} );
webView.loadString("<form action='#'><input/><input/><input/></form>");
webView.assignFocus();
bottomControl.type = TextFieldType.INPUT;
addChild( bottomControl );
bottomControl.y = stage.stageHeight - 60;
bottomControl.height = 60;
bottomControl.width = stage.stageWidth;
bottomControl.background = true;
bottomControl.text = "One control on the bottom.";
bottomControl.addEventListener( FocusEvent.FOCUS_IN, flashFocusIn );
bottomControl.addEventListener( FocusEvent.FOCUS_OUT, flashFocusOut ); }
private function webFocusIn( event:FocusEvent ):void
{
trace("Web focus in");
}
private function webFocusOut( event:FocusEvent ):void
{
trace("Web focus out: " + event.direction);
if( event.direction == FocusDirection.TOP )
{
stage.focus = topControl;
}
else
{
stage.focus = bottomControl;
}
}
private function flashFocusIn( event:FocusEvent ):void
{
trace("Flash focus in");
var textfield:TextField = event.target as TextField;
textfield.backgroundColor = 0xff5566;
}
private function flashFocusOut( event:FocusEvent ):void
{
trace("Flash focus out");
var textfield:TextField = event.target as TextField;
textfield.backgroundColor = 0xffffff;
}
}
}
Przechwytywanie bitmap
Obiekt StageWebView jest renderowany przed całą zawartością listy wyświetlania (zasłania ją). Nie można dodać zawartość przed obiektem StageWebView. Nie można na przykład rozwinąć menu przed zawartością obiektu StageWebView. Aby rozwiązać ten problem, należy przechwycić migawkę obiektu StageWebView. Następnie należy ukryć obiekt StageWebView i zamiast niego dodać bitmapę-migawkę.
Poniższy przykład ilustruje sposób przechwytywania migawki obiektu StageWebView przy użyciu metody
drawViewPortToBitmapData
. Obiekt StageWebView jest ukrywany przez ustawienie wartości null dla właściwości stage. Po zakończeniu wczytywania strony internetowej następuje wywołanie funkcji przechwytującej i wyświetlającej bitmapę. Po uruchomieniu ten kod wyświetli dwie etykiety — Google i Facebook. Kliknięcie etykiety spowoduje przechwycenie odpowiedniej strony internetowej i wyświetlenie jej jako migawki na stole montażowym.
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.*;
import flash.geom.Rectangle;
import flash.media.StageWebView;
import flash.net.*;
import flash.text.TextField;
public class stagewebview extends Sprite
{
public var webView:StageWebView=new StageWebView();
public var textGoogle:TextField=new TextField();
public var textFacebook:TextField=new TextField();
public function stagewebview()
{
textGoogle.htmlText="<b>Google</b>";
textGoogle.x=300;
textGoogle.y=-80;
addChild(textGoogle);
textFacebook.htmlText="<b>Facebook</b>";
textFacebook.x=0;
textFacebook.y=-80;
addChild(textFacebook);
textGoogle.addEventListener(MouseEvent.CLICK,goGoogle);
textFacebook.addEventListener(MouseEvent.CLICK,goFaceBook);
webView.stage = this.stage;
webView.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
}
public function goGoogle(e:Event):void
{
webView.loadURL("http://www.google.com");
webView.stage = null;
webView.addEventListener(Event.COMPLETE,handleLoad);
}
public function goFaceBook(e:Event):void
{
webView.loadURL("http://www.facebook.com");
webView.stage = null;
webView.addEventListener(Event.COMPLETE,handleLoad);
}
public function handleLoad(e:Event):void
{
var bitmapData:BitmapData = new BitmapData(webView.viewPort.width, webView.viewPort.height);
webView.drawViewPortToBitmapData(bitmapData);
var webViewBitmap:Bitmap=new Bitmap(bitmapData);
addChild(webViewBitmap);
}
}
}
|
|
|