Visualización de contenido HTML en aplicaciones móviles

Adobe AIR 2.5 y posterior

La clase StageWebView muestra contenido HTML utilizando el control de navegador del sistema en los dispositivos móviles y el uso del control estándar HTMLLoader de Adobe® AIR® en los equipos de escritorio. Compruebe la propiedad StageWebView.isSupported para determinar si la clase se admite en el dispositivo actual. La compatibilidad no está garantizada en todos los dispositivos en el perfil móvil.

En todos los perfiles, la clase StageWebView solo admite la interacción limitada entre el contenido HTML y el resto de la aplicación. También se puede controlar la navegación, pero no se permite la reutilización de scripts ni el intercambio directo de datos. Es posible cargar contenido desde una URL local o remota o transmitir una cadena de HTML.

Adobe recomienda

AIR2.5 StageWebView demo – OAuth Support (Demostración de StageWebView en AIR 2.5 – Compatibilidad con OAuth, en inglés)

Mark Doherty
El gurú Mark Doherty demuestra cómo conectarse a un sitio protegido con OAuth como Twitter con la clase StageWebView.

Adobe recomienda

¿Conoce algún tutorial y quiere compartirlo?

Making the most of StageWebView (Cómo sacar el máximo partido a StageWebView, en inglés)

Sean Voisen

HTML Web View in Air for Android (Vista web HTML en AIR for Android, en inglés)

Jonathan Campos

Create a basic web browser with StageWebView (Creación de un navegador web básico con StageWebView, en inglés)

Rich Tretola

AIR Mobile StageWebView UIComponent (Componente de UI StageWebView en AIR para móvil, en inglés)

Sönke Rohde

Using StageWebView within a UIComponent in Mobile (Uso de StageWebView en un componente de UI para móviles, en inglés)

Judah Frangipane

Objetos StageWebView

El objeto StageWebView no es un objeto de visualización y no se puede añadir a la lista de visualización. Funciona como ventana gráfica añadida directamente al escenario. El contenido de StageWebView se dibuja sobre la parte superior de cualquier contenido de la lista de visualización. No hay ninguna manera de controlar el orden de dibujo de diferentes objetos StageWebView.

Para mostrar un objeto StageWebView, se asigna el escenario en el que va a aparecer el objeto a la propiedad stage de StageWebView. Establezca el tamaño de la visualización utilizando la propiedad viewPort .

Establezca las coordenadas x e y de la propiedad viewPort entre -8192 y 8191. El valor máximo de la anchura y la altura del escenario es 8191. Si el tamaño sobrepasa los valores máximos, se emitirá una excepción.

En el siguiente ejemplo se crea un objeto StageWebView, se establecen las propiedades stage y viewPort y se muestra una cadena 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 un objeto StageWebView, establezca su propiedad stage en null . Para destruir todo el objeto, llame al método dispose() . La llamada a dispose() es opcional, pero ayuda al recolector de elementos no utilizados a recuperar antes la memoria utilizada por el objeto.

Contenido

Se puede cargar el contenido en un objeto StageWebView utilizando dos métodos: loadURL() y loadString() .

El método loadURL() carga un recurso en la URL especificada. Es posible utilizar cualquier esquema de URI admitido por el control de navegador web del sistema, incluyendo: data:, file:, http:, https: y javascript:. No se admiten los esquemas app: y app-storage:. AIR no valida la cadena URL.

El método loadString() carga una cadena literal que incluye contenido HTML. La ubicación de la página cargada con este método se expresa de la siguiente manera:
  • En el escritorio: about:blank

  • En iOS: htmlString

  • En Android: el formato de URI de datos del htmlString codificado

El esquema de URI determina las reglas para cargar los datos o el contenido incorporado.

Esquema de URI

Carga de recursos locales

Carga de recursos remotos

XMLHttpRequest local

XMLHttpRequest remota

data:

No

No

No

file:

http:, https:

No

No

Mismo dominio

about: (loadString() method)

No

No

No

Nota: si la propiedad displayState del escenario se establece en FULL_SCREEN , en Desktop, no se puede escribir en un campo de texto mostrado en StageWebView. No obstante, en iOS y Android, es posible escribir en un campo de texto en StageWebView aunque la propiedad displayState del escenario sea FULL_SCREEN .

En el siguiente ejemplo se utiliza un objeto StageWebView para mostrar un sitio web de 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" ); 
        } 
    } 
}

En los dispositivos de Android, se debe especificar el permiso de INTERNET de Android para que la aplicación pueda cargar correctamente los recursos remotos.

En Android 3.0+, una aplicación debe activar la aceleración de hardware en el elemento manifestAdditions de Android del descriptor de la aplicación de AIR para mostrar contenido de plug-in en un objeto StageWebView. Consulte Activación de Flash Player y otros plug-ins en un objeto StageWebView .

URI de JavaScript

Se puede utilizar un URI de JavaScript para llamar a una función definida en la página HTML que se cargue mediante un objeto StageWebView. La función que se llama utilizando el URI de JavaScript se ejecuta en el contexto de la página web cargada. En el siguiente ejemplo se utiliza un objeto StageWebView para llamar a una función de 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 navegación

Cuando un usuario hace clic en un vínculo en HTML, el objeto StageWebView distribuye un evento locationChanging . Se puede llamar al método preventDefault() del objeto de evento para detener la navegación. De lo contrario, el objeto StageWebView se desplaza a la nueva página y distribuye un evento locationChange . Una vez finalizada la carga de la página, StageWebView distribuye un evento complete .

Un evento locationChanging se distribuye en cada redirección HTML. Los eventos locationChange y complete se distribuyen en el momento adecuado.

En iOS, se distribuye un evento locationChanging antes de locationChange , excepto en el primer método loadURL( ) o l oadString() . Un evento locationChange también se distribuye para los cambios de navegación mediante iFrames y Frames.

En el siguiente ejemplo se muestra cómo se puede evitar un cambio de ubicación y abrir la nueva página en el navegador del 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 ) ); 
        } 
    } 
}

Historial

Conforme un usuario hace clic en los vínculos del contenido mostrado en un objeto StageWebView, el control guarda las pilas de historial de hacia atrás y hacia delante. El siguiente ejemplo muestra cómo desplazarse en las dos pilas del historial. En el ejemplo se utilizan las teclas programadas Back y Search.

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(); 
            } 
        } 
    } 
}

Selección

Aunque no es un objeto de visualización, la clase StageWebView contiene miembros que permiten administrar las transiciones seleccionadas dentro y fuera del control.

Cuando el objeto StageWebView se selecciona, distribuye un evento focusIn . Este evento se utiliza para administrar los elementos seleccionados en la aplicación, si es necesario.

Cuando StageWebView pierde la selección, distribuye un evento focusOut . Una instancia de StageWebView puede perder la selección si un usuario “pasa” el primer o el último control de la página web utilizando una bola de seguimiento de dispositivo o las flechas de dirección. La propiedad direction del objeto event permite saber si el flujo de selección sube y sobrepasa la parte superior de la página o desciende a la parte inferior. Utilice esta información para asignar la selección al objeto de visualización adecuado en la parte superior o inferior de StageWebView.

En iOS, la selección no se puede establecer mediante programación. StageWebView distribuye eventos focusIn y focusOut con la propiedad direction de FocusEvent establecida en none . Si el usuario toca dentro de StageWebView, se distribuye el evento focusIn . Si el usuario toca fuera de StageWebView, se distribuye el evento focusOut .

El siguiente ejemplo ilustra el modo en que la selección pasa del objeto StageWebView a los objetos de visualización de 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 mapas de bits

Un objeto StageWebView se representa sobre todo el contenido de la lista de visualización. No se puede añadir contenido sobre un objeto StageWebView. Por ejemplo, no se puede expandir un elemento desplegable sobre el contenido StageWebView. Para resolver este problema, capture una instantánea de StageWebView. A continuación, oculte StageWebView y añada la instantánea de mapa de bits.

El siguiente ejemplo muestra cómo capturar la instantánea de un objeto StageWebView utilizando el método drawViewPortToBitmapData . Oculta el objeto StageWebView estableciendo el escenario en null. Tras cargar por completo la página web, se llama a una función que captura el mapa de bits y lo muestra. Cuando se ejecuta, el código muestra dos etiquetas: Google y Facebook. Al hacer clic en la etiqueta, se captura la página web correspondiente y se muestra como instantánea en el escenario.

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); 
        } 
    } 
}