<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="init()" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.messaging.AbstractConsumer;
import mx.containers.Panel;
import mx.events.FlexEvent;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.VideoDisplay;
[Bindable]
private var totalCams : Number = 0;
[Bindable]
private var camarasListas : Array;
private function init( ):void
{
camarasListas = [];
actualizarCamaras();
}
/**
* Quita todas las camaras que existan en el Tile y carga nuevamente todas las camaras
* registradas en el Flash Player.
*
* NOTA: Este metodo no detectara si han sido agregadas nuevas camaras, solo reactivara
* las que hayan sido desactivadas por eventos tales como desconexion del cable de la
* camara, por ejemplo. Para detectar nuevas camaras agregadas, es necesario cerrar el
* navegador y abrir la aplicacion nuevamente.
**/
private function actualizarCamaras():void
{
quitarTodasLasCamaras();
iniciarTodasLasCamaras();
}
/**
* Inicia el proceso de encendido y agregacion a la vista de todas las camaras registradas
* en Flash Player.
**/
private function iniciarTodasLasCamaras( ):void
{
if ( Camera.names.length != 0 )
{
for ( var i : uint = 0; i < Camera.names.length; i++ )
{
crearVideoDisplay();
cargarCamara( i );
}
}
else
{
Alert.show("No hay camaras instaladas. Instale más de una camara y presione " +
"el boton Actualizar.");
}
}
/**
* Crea un VideoDisplay y lo agrega como hijo a un Panel. Este Panel se agrega a la vista
* como hijo del contenedor tileVideos.
**/
private function crearVideoDisplay():void
{
var panel : Panel = new Panel();
var display : VideoDisplay = new VideoDisplay();
display.addEventListener( FlexEvent.CREATION_COMPLETE, displayCreationCompleteHandler, false, 0, true );
panel.addChild( display );
tileVideos.addChild( panel );
}
/**
* Carga la camara correspondiente al indice indicado y la agrega a la lista de camaras
* listas.
**/
private function cargarCamara( indice : uint ):void
{
var camara : Camera = Camera.getCamera( String( indice ) );
if ( camara != null )
{
camara.addEventListener( ActivityEvent.ACTIVITY, camaraActivityEventHandler, false, 0, true );
camarasListas.push( camara );
}
}
/**
* Agrega una camara al VideoDisplay que despacho el evento. Es necesario esperar a que el
* VideoDisplay este creado completamente para poder agregarle la camara; de lo contrario,
* el tamaño del VideoDisplay no se ajusta al tamaño de presentacion de la camara.
**/
private function displayCreationCompleteHandler( event : FlexEvent ):void
{
agregarCamaraADisplay( VideoDisplay( event.currentTarget ),
Camera( camarasListas.pop() ) );
}
/**
* Agrega la camara indicada al VideoDisplay indicado.
**/
private function agregarCamaraADisplay( display : VideoDisplay, camara : Camera ):void
{
camara.setMode( 320, 240, 15, false );
display.width = camara.width;
display.height = camara.height;
display.attachCamera( camara );
}
/**
* Quita todas las camaras y los contenedores del tileVideos.
**/
private function quitarTodasLasCamaras():void
{
while ( tileVideos.numChildren > 0 )
{
var panel : Panel = Panel( tileVideos.getChildren()[tileVideos.numChildren - 1] );
var display : VideoDisplay = VideoDisplay( panel.getChildAt( 0 ) );
display.attachCamera( null );
panel.removeChild( display );
tileVideos.removeChild( panel );
display = null;
panel = null;
}
}
private function camaraActivityEventHandler( event : ActivityEvent ):void
{
trace("Actividad: " + event);
}
]]>
</mx:Script>
<mx:Box
direction="vertical"
width="100%" height="100%">
<mx:ApplicationControlBar
width="100%">
<mx:Button
label="Actualizar"
click="actualizarCamaras()"/>
</mx:ApplicationControlBar>
<mx:Tile
id="tileVideos"
direction="horizontal"
width="100%" height="100%">
</mx:Tile>
</mx:Box>
</mx:Application>