Exibição de conteúdo HTML em aplicativos móveisAdobe AIR AIR 2.5 e posterior A classe StageWebView exibe conteúdo HTML usando o controle do navegador do sistema em dispositivos móveis e usando o controle Adobe® AIR® HTMLLoader padrão em computadores desktop. Verifique a propriedade StageWebView.isSupported para determinar se a classe conta com suporte no dispositivo atual. O suporte não é garantido para todos os dispositivos no perfil móvel. Em todos os perfis, a classe StageWebView oferece suporte somente à interação limitada entre o conteúdo HTML e o resto do aplicativo. Você pode controlar a navegação, mas scripts cruzados e a troca direta de dados não são permitidos. Você pode carregar conteúdo de um URL local ou remoto ou passá-lo em uma string de HTML. Objetos StageWebViewO objeto StageWebView não é um objeto de exibição e não pode ser adicionado à lista de exibição. Em vez disso, ele funciona como um viewport anexado diretamente ao palco. O conteúdo StageWebView desenha sobre qualquer conteúdo de lista de exibição. Não há nenhum modo de controlar a ordem de desenho de diferentes objetos StageWebView. Para exibir um objeto StageWebView, atribua o palco em que o objeto se encontra de modo a ser exibido para a propriedade stage do StageWebView. Defina o tamanho da exibição usando a propriedade viewPort. Defina as coordenadas X e Y da propriedade viewPort entre -8192 e 8191. O valor máximo da altura e da largura do palco é 8191. Se o tamanho exceder os valores máximos, uma exceção será lançada. O seguinte exemplo cria um objeto StageWebView, define as propriedades stage e viewPort e exibe uma string de 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 );
Para ocultar um objeto StageWebView, defina sua propriedade stage como null. Para destruir o objeto completamente, chame o método dispose(). Chamar dispose() é opcional, mas ajuda o coletor de lixo a recuperar mais cedo a memória usada pelo objeto. ConteúdoVocê pode carregar conteúdo em um objeto StageWebView usando dois métodos: loadURL() e loadString(). O método loadURL() carrega um recurso no URL especificado. Você pode usar qualquer esquema de URI com suporte no controle de navegador da Web do sistema, inclusive: data:, file:, http:, https: e javascript:. Os esquemas app: e app-storage: não são compatíveis. O AIR não valida a string do URL. O método loadString() carrega uma string literal com conteúdo HTML. O local de uma página carregada com esse método é expresso como:
O esquema de URI determina as regras de carregamento de conteúdo ou dados incorporados.
Nota: Se a propriedade displayState do palco for definida como FULL_SCREEN, no desktop, você não poderá digitar em um campo de texto exibido em StageWebView. No entanto, no iOS e no Android, você pode digitar em uma campo de texto em StageWebView, mesmo que o displayState do palco seja FULL_SCREEN.
O exemplo a seguir usa um objeto StageWebView para exibir o site da Adobe da Web: 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" );
}
}
}
Em dispositivos Android, é preciso especificar a permissão INTERNET do Android para que o aplicativo carregue com sucesso os recursos remotos. URI JavaScriptVocê pode usar um URI JavaScript para chamar uma função definida na página HTML carregada pelo objeto StageWebView. A função que você chama usando o URI JavaScript URI é executada no contexto da página da Web carregada. O exemplo a seguir usa um objeto StageWebView para chamar uma função 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 );
}
}
}
Eventos de navegaçãoQuando o usuário clica em um link no HTML, o objeto StageWebView despacha um evento locationChanging. Você pode chamar o método preventDefault() do objeto de evento para parar a navegação. Caso contrário, o objeto StageWebView navegará para a nova página e despachará um evento locationChange. Quando o carregamento da página for concluído, o StageWebView despacha um evento complete. Um evento locationChanging é despachado a cada redirecionamento do HTML. Os eventos locationChange e complete são despachados no momento oportuno. No iOS, um evento locationChanging é despachado antes de um evento locationChange, com exceção dos primeiros métodos loadURL() ou loadString(). Um evento locationChange também é despachado para alterações de navegação por iFrames e Frames. O exemplo a seguir ilustra como você pode evitar uma alteração local e, em vez disso, abrir abrir a nova página no navegador do sistema. 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 ) );
}
}
}
HistóricoQuando o usuário clica em links no conteúdo exibido em um objeto StageWebView, o controle salva as pilhas de histórico de avanço e de retrocesso. O exemplo a seguir ilustra como navegar pelas duas pilhas de histórico. O exemplo usa as teclas programáveis Voltar e Pesquisar. 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();
}
}
}
}
FocoEmbora não seja um objeto de exibição, a classe StageWebView contém membros que permitem gerenciar as transições do foco para um controle ou para fora dele. Quando o objeto StageWebView recebe o foco, despacha um evento focusIn. Use esse evento para gerenciar os elementos de foco no aplicativo, se necessário. Quando o StageWebView abre mão do foco, despacha um evento focusOut. Uma ocorrência de StageWebView pode abrir mão do foco quando o usuário usa a tabulação passando pelo primeiro ou pelo último controle na página da Web usando o trackball ou as setas de direção de um dispositivo. A propriedade direction do objeto de evento permite saber se o fluxo do foco está subindo acima do topo da página ou descendo além da parte inferior da página. Use estas informações para atribuir o foco ao objeto de exibição apropriado acima ou abaixo de StageWebView. No iOS, o foco não pode ser definido programaticamente. O StageWebView despacha eventos focusIn e focusOut com a propriedade direction de FocusEvent definida como none. Se o usuário tocar dentro do StageWebView, o evento focusIn é despachado. Se o usuário tocar fora do StageWebView, o evento focusOut é despachado. O exemplo a seguir ilustra como o foco passa do objeto StageWebView para objetos de exibição do 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;
}
}
}
Captura de bitmapUm objeto StageWebView é renderizado acima de todo o conteúdo da lista de exibição. Não é possível adicionar um conteúdo acima do objeto StageWebView. Por exemplo, não é possível expandir uma lista suspensa sobre o conteúdo de StageWebView. Para solucionar esse problema, faça a captura de um instantâneio de StageWebView. Em seguida, oculte o StageWebView e adicione o instantâneio em bitmap em seu lugar. O exemplo a seguir ilustra como capturar o instantâneo de um objeto StageWebView usandop o método drawViewPortToBitmapData. Ele oculta o objeto StageWebView definido o palco como null. Depois que a página da Web estiver totalmetne carregada, chame uma função que captura o bitmap e o exibe. Quando executado, o código exibe dois rótulos, Google e Facebook. Clicar no rótulo captura a página da Web correpondente e a exibe como um instantâneo no palco. 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);
}
}
}
|
|