Blz?!
A primeira vista o título pode soar no mínimo estranho, mas logo logo você vai entender e concordar (ou continuar achando que sou louco).
Mas vamos ao que interessa, nesse post vou mostrar como você pode gerar uma imagem de qualquer componente da sua aplicação e apartir dai é só usar a criatividade. A classe responsável em "gerar a imagem" é a UISnapShot e o restante é a parte do "usar a criatividade"
package Componente {
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.display.Bitmap;
import mx.controls.Image;
import mx.core.UIComponent;
public class UISnapShot extends Image {
public function UISnapShot() {
/* Definindo largura e altura para que a imagem ocupe
100% do espaço onde for adicionada */
this.percentWidth = 100;
this.percentHeight = 100;
super();
}
public function set targetUI(Target: UIComponent): void {
// Método set para definir o alvo
drawUISnapShot(Target);
}
private function drawUISnapShot(Target: UIComponent): void {
var UIBData:BitmapData = new BitmapData(Target.width, Target.height);
var UIMatrix:Matrix = new Matrix();
UIBData.draw(Target, UIMatrix);
source = new Bitmap(UIBData);
invalidateDisplayList();
}
}
}
Agora que já vimos como "tirar foto do componente", vamos a parte de criatividade. Desde que eu instalei o W7 uma das poucas coisas que eu gostei foi a miniatura do aplicativo minimizado que aparece sempre que você coloca o mouse na barra de tarefas então para esse exemplo eu fiz uma classe bem simples para fazer as miniaturas das telas minimizadas na aplicação. E para isso eu fiz uma classe chamada FDockBarW7 (apesar de não ser uma dockBar foi o primeiro nome que me veio na cabeça).
package Componente {
import Function.FParam;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.containers.Canvas;
import mx.core.UIComponent;
import mx.effects.Fade;
public class FDockBarW7 extends Canvas {
private var _uParam: FParam = FParam.getInstance();
private var _uParent: Object = new Object();
private var _uTarget: Object = new Object();
private var _uImgDock: UISnapShot = new UISnapShot();
private static var _rInstance: FDockBarW7;
public function FDockBarW7(Type: PrivateFDockBarW7) {
super();
addEventListener(MouseEvent.MOUSE_OVER, removeSnapShot);
if (Type == null)
throw new Error('Obtenha uma instância da classe usando o método getInstante().');
}
public static function getInstance(): FDockBarW7 {
if (_rInstance == null)
_rInstance = new FDockBarW7 (new PrivateFDockBarW7());
return _rInstance;
}
public function showSnapShot(Parent: Object, Target: Object = null, Time: int = 3000): void {
var
_rTimer: Timer = new Timer(Time, 1);
_rTimer.addEventListener(TimerEvent.TIMER, proRemove);
_rTimer.start();
function proRemove(evTimer: TimerEvent): void {
dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OVER));
}
_uParent = Parent;
_uTarget = Target;
this.x = _uParent.x;
this.y = _uParent.y - 160;
_uImgDock.width = 300;
_uImgDock.height = 150;
if (_uTarget != null)
_uImgDock.targetUI = _uTarget as UIComponent;
else
_uImgDock.targetUI = _uParent as UIComponent;
this.addChild(_uImgDock);
_uParam._sMDIApp.addChild(this);
}
public function removeSnapShot(e: MouseEvent): void {
try {
// _sMDIApp é o canvas principal da minha aplicação
_uParam._sMDIApp.removeChild(this);
}
catch (e: Error){
}
}
}
}
internal class PrivateFDockBarW7 {
public function PrivateFDockBarW7() {
}
}
Já temos duas classes, UISnapShot para "tirar a foto" e a FDockBarW7 para montar a miniatura da janela. Nesse exemplo estou usando o MDIWindow.
public static function openTela(Componente: DisplayObject, Caption: String): void {
var
_rDock: FDockBarW7 = FDockBarW7.getInstance(),
_rTela: MDIWindow = new MDIWindow();
// Listener para detectar o mouse sobre a tela
_rTela.addEventListener(MouseEvent.MOUSE_OVER, show);
// Configuração da tela
_rTela.title = Caption;
_rTela.height = 400;
_rTela.width = 500;
_rTela.layout = 'vertical';
_rTela.addChild(Componente);
/* _sMDIApp mais uma vez o canvas principal da aplicação
é o canvas de base usado pora adicionar telas, alert
personalizado entre outros . . .*/
_uFparam._sMDIApp.windowManager.add(_rTela);
function show(e: MouseEvent): void {
// se a tela estiver minimizada . . .
if (_rTela.minimized)
_rDock.showSnapShot(_rTela, Componente);
}
}
private function cliBntAbrirTela(): void {
var _r: FParam = FParam.getInstance();
var _t: Teste = new Teste();
_r._sMDIApp = cvApp;
FncUtil.openTela(_t, 'teste');
}
Bons estudos e bom trabalho a todos.
Abraços


5 comentários:
Nossa muito bacana, depois vou dar uma revisada, mas obrigado e um componente bem interessante.
E este FParam = FParam.getInstance();
Nao esta no exemplo meu camarada!
Boa noite José,
Não postei a classe FParam porque é um singleton simples onde armazeno alguns informações da aplicação tais como: MDICanvas, usuário logado e o que mais for conviniente.
Se você precisar de ajuda com o Singleton só falar que eu tento lhe ajudar.
[]´s
Maravilha de Post!
Eu estava tentando fazer capturas usando ImageSnapshot de animações/videos SWF e FLV rodando respectivamente nos controles SWFLoader e VideoDisplay em uma app Air, porém dava erro de violação de sandbox; mesmo os arquivos rodando dentro da pasta da aplicação (app:/).
Usando seu exemplo rodou perfeito!
Wemerson, eu já havia agradecido seu comentário anteriormente mas devo ter feito OSTA porque sumiu, sendo assim, antes tarde do que nunca.
Muito obrigdo e fico contente que o post tenha lhe ajudado!!
[]´s
Postar um comentário