Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

Zoom con Flash CS3

This is a discussion on Zoom con Flash CS3 within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Eh si, sempre la classe BitmapData :) Questa classe è davvero un gioiello per chi ama Flash. Come già visto ...


Go Back   Forum Flash CS3 Flash CS4 > Flash CS3 e Actionscript 3.0 > Articoli e tutorials

Register Blogs FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 19-09-07, 13:19
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,356
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
Zoom con Flash CS3


Eh si, sempre la classe BitmapData :)

Questa classe è davvero un gioiello per chi ama Flash.

Come già visto in precedenza : BitmapData e metodo draw , vedremo che questo metodo è davvero molto di più di quello che sembra.

Navigando il web, mi sono accorto che spesso mi imbatto in applicazioni che (alcune meglio alcune peggio) simulano uno Zoom ad una immagine e/o testo.

E' una cosa davvero interessante mettere a confronto diverse tecniche, per cui dopo un paio d'ore di scripting ho creato una classe...


Creo un FLA e lo salvo con nome ' zoom.fla ', creo una MovieClip che fungerà da preloader ( in questo caso utlizzo lo stesso preloader di questo articolo: Caricare un swf esterno con Flash CS3).

Poi mi creo la Document Class e salvo con nome ' Zoommando.as ' :
Code:
package
{
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.display.Loader;
	import flash.events.*;
	import flash.net.URLRequest;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	
	public class Zoommando extends MovieClip
	{
		private var clip_mc:MovieClip;
		private var barra:Shape;
		private var bottone:Sprite;
		private var urlImmagine:String;
		private var loader:Loader;
		private var grill:BitmapData;
		private var image:Bitmap;
		private var image2:Bitmap;
		private var rest:Number=50/100;
		private var xx:Number;
		private var rest2:Number;
		private var matrice:Matrix;
		
		public function Zoommando()
		{
			init();
		}
		
		private function init():void
		{
			info_mc.visible=false;
			matrice=new Matrix();
			grill=new BitmapData(100,100);
			image2=new Bitmap();
			disegnaBarra();
			disegnaBottone();
			caricaImmagine();
		}
		
		private function disegnaBarra():void
		{
			barra=new Shape();
			barra.graphics.moveTo(0,0);
			barra.graphics.lineStyle(1,0x0);
			barra.graphics.lineTo(100,0);
			addChild(barra);
			barra.x=stage.stageWidth/2;
			barra.y=20;
		}
		
		private function disegnaBottone():void
		{
			bottone=new Sprite();
			bottone.graphics.moveTo(-10,-10);
			bottone.graphics.beginFill(0xFF6600,1);
			bottone.graphics.lineTo(10,-10);
			bottone.graphics.lineTo(10,10);
			bottone.graphics.lineTo(-10,10);
			bottone.graphics.lineTo(-10,-10);
			bottone.graphics.endFill();
			addChild(bottone);
			bottone.x=barra.x;
			bottone.y=barra.y;
			bottone.buttonMode=true;
		}
		
		private function caricaImmagine():void
		{
			urlImmagine='http://www.flepstudio.org/swf/pic_big.jpg';
			var request:URLRequest=new URLRequest(urlImmagine);
			loader=new Loader();
			initListeners(loader.contentLoaderInfo);
			loader.load(request);
		}
		
		private function initListeners(dispatcher:IEventDispatcher):void 
		{
			dispatcher.addEventListener(Event.OPEN,inizia);
			dispatcher.addEventListener(ProgressEvent.PROGRESS,inCaricamento);
			dispatcher.addEventListener(Event.COMPLETE,completato);
			dispatcher.addEventListener(IOErrorEvent.IO_ERROR,seErrore);
		}
		private function inizia(event:Event):void 
		{
			info_mc.visible=true;
		}
		private function inCaricamento(event:ProgressEvent):void 
		{
			var n:uint=(event.bytesLoaded/event.bytesTotal)*100;
			info_mc.loading_txt.text='Loading '+n.toString()+' %';
			var nn:uint=(event.bytesLoaded/event.bytesTotal)*info_mc.border_mc.width;
			info_mc.fill_mc.width=nn;
		}
		private function completato(event:Event):void 
		{
			info_mc.visible=false;
			addChild(loader);
			loader.y=45;
			initBitmap();
		}
		private function seErrore(event:IOErrorEvent):void 
		{
			trace("ioErrorHandler: "+event);
		}
		
		private function initBitmap():void
		{
			var scale:Number=50;
			scale/=100;
			var scaleMatrix:Matrix=new Matrix();
			scaleMatrix.scale(scale,scale);
			var bitdata:BitmapData=new BitmapData(loader.width*scale,loader.height*scale,true,0xFFFFFFFF);
			bitdata.draw(loader,scaleMatrix);
			image=new Bitmap(bitdata);
			addChild(image);
			image.y=loader.y;
			removeChild(loader);
			initBottoneListeners();
		}
		
		private function initBottoneListeners():void
		{
			bottone.addEventListener(MouseEvent.MOUSE_DOWN,sulClick);
			bottone.addEventListener(MouseEvent.MOUSE_UP,sulRilascio);
		}
		private function sulClick(event:MouseEvent):void
		{
			image2.removeEventListener(Event.ENTER_FRAME,fadeImages);
			grill.dispose();
			image.alpha=1;
			var rect:Rectangle= new Rectangle(barra.x,barra.y,barra.width,barra.height);
			bottone.startDrag(false,rect);
			bottone.addEventListener(Event.ENTER_FRAME,attivaIntervallo);
			removeChild(clip_mc);
		}
		private function sulRilascio(event:MouseEvent):void
		{
			bottone.removeEventListener(Event.ENTER_FRAME,attivaIntervallo);
			bottone.stopDrag();
			disegnaNuovaBitmap();
		}
		private function attivaIntervallo(event:Event):void
		{
			xx=(bottone.x-barra.x)/100;
			matrice.tx=0;
			matrice.ty=45;
			matrice.a=1+rest*xx*2;
			matrice.d=1+rest*xx*2;
			image.transform.matrix=matrice;
			rest2=matrice.d-1;
		}
		private function disegnaNuovaBitmap():void
		{
			var scale:Number=50+xx*50;
			scale/=100;
			var scaleMatrix:Matrix=new Matrix();
			scaleMatrix.scale(scale,scale);
			grill=new BitmapData(loader.width*scale,loader.height*scale,true,0xFFFFFFFF);
			grill.draw(loader,scaleMatrix);
			image2=new Bitmap(grill);
			clip_mc=new MovieClip();
			addChild(clip_mc);
			clip_mc.addChild(image2);
			clip_mc.buttonMode=true;
			image2.y=45;
			clip_mc.alpha=0;
			initImageListener();
		}
		private function initImageListener():void
		{
			clip_mc.addEventListener(Event.ENTER_FRAME,fadeImages);
		}
		private function fadeImages(event:Event):void
		{
			var arrImage2:int=1;
			var da:Number=arrImage2-clip_mc.alpha;
			var aa:Number=da*.1;
			clip_mc.alpha+=aa;
			
			var arrImage:int=0;
			var daa:Number=arrImage-image.alpha;
			var aaa:Number=daa*.1;
			image.alpha+=aaa;
			if(Math.abs(da)<=0.05)
			{
				clip_mc.removeEventListener(Event.ENTER_FRAME,fadeImages);
				clip_mc.alpha=arrImage2;
				image.alpha=arrImage;
				callDrag();
			}
		}
		
		private function callDrag():void
		{
			clip_mc.addEventListener(MouseEvent.MOUSE_DOWN,muoviClip);
			clip_mc.addEventListener(MouseEvent.MOUSE_UP,lasciaClip);
		}
		
		private function muoviClip(e:MouseEvent):void
		{
			clip_mc.startDrag();
		}
		private function lasciaClip(e:MouseEvent):void
		{
			clip_mc.stopDrag();
		}
	}
}
Risultato:










In questo script non c'è nulla di nuovo che non abbiamo visto, tranne che qualche calcolo matematico che ho applicato e la classe Matrix (altra gran bella classe che approfondiremo più avanti).

- Disegno barra e bottone

- Carico un immagine ad alta risoluzione

- Scatto una foto a questa immagine con il metodo BitmapData.draw e rimuovo l'immagine caricata (attenzione a questo passaggio, perchè rimuovere non significa dire al Loader di scaricarla, l' immagine non è visibile in quanto non è più nel nostro ObjectDisplay ma rimane fotografabile dal metodo draw)

- Aggiungo i listeners necessari

- Quando il bottone è premuto, oltre allo startDrag controllato, attivo un intervallo che mi ingrandisce l'immagine (ottenuta prima con draw e scalata del 50%) utilizzando la matrice di quella immagine (quindi la classe Matrix) in base al valore di una variabile datomi da un controllo matematico di proporzioni.

- Quando il bottone viene rilasciato, controllo di quanto è stata scalata l'immagine , scatto una foto all'immagine ad alta risoluzione che ho caricato e la scalo della stessa percentuale, in modo che la nuova immagine non risulti più sgranata.

- Faccio un fade/in fade/out di alpha tra l'immagine sgranata e quella 'sana'




Allego i files sorgente:
Attached Files
File Type: zip zoom.zip (244.3 KB, 17 views)

__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !

Last edited by Flep; 04-06-08 at 23:08.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

  #2 (permalink)  
Old 15-11-07, 08:55
Junior Member
 
Join Date: Nov 2007
Posts: 4
Rep Power: 0
Romi is on a distinguished road
Re: Zoom con Flash CS3

Ciao flep...
Ho visto un sito che usa uno zoom script che non posso trovare da nessuna parte...
L'indirizzo e index
Dai un'occhiata x favore...
Se mi puoi dare una mano ti saro molto gratto...
Anticipatamente ringrazio
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 15-11-07, 09:03
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,356
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
Re: Zoom con Flash CS3

Ciao Romi e benvenuto

Quello 'zoom' ( non è un vero e proprio zoom ) necessita di proporzioni matematiche.
In sostanza in base alle coordinate di una istanza Rectangle ( quello col bordo rosso piccolino ) muovi la foto grande che è mascherata.
Appena ho del tempo ti faccio un esempio
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 15-11-07, 09:37
Junior Member
 
Join Date: Nov 2007
Posts: 4
Rep Power: 0
Romi is on a distinguished road
Re: Zoom con Flash CS3

Grazie mille...
Sei molto gentile.
Sono in atesa di un tuo esempio...
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5 (permalink)  
Old 29-11-07, 12:08
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,356
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
Re: Zoom con Flash CS3

Ciao Romi, chiedo scusa per il ritardo ma le cose da fare sono tante.
Ho creato il tuo esempio e domani lo pubblicherò perciò volevo avvisarti
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

photoFlow

  #6 (permalink)  
Old 30-11-07, 06:43
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,356
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
Re: Zoom con Flash CS3

Ciao Romi,
ecco l' esempio:

http://www.flepstudio.org/forum/util...navigator.html
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #7 (permalink)  
Old 01-06-08, 00:08
Junior Member
 
Join Date: May 2008
Posts: 2
Rep Power: 0
maiocchino is on a distinguished road
Re: Zoom con Flash CS3

Ciao Flep.

Mi sono appena iscritto al forum, mi sembra eccezionale. L'ho trovato mentre cercavo di capire come replicare questo effetto di zoom: http://www.feanor.net/z0r/shock/superZOOM.swf
Mi sembra che il tuo esempio sia molto vicino alla soluzione del problema. Come faresti la transizione tra due immagini differenti?
Grazie. Roberto
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #8 (permalink)  
Old 03-06-08, 12:30
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,356
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
Re: Zoom con Flash CS3

Ciao maiocchino e benvenuto

Molto bello quell' esempio.
Forse usa il draw() della BitmapData ? Oppure carica le immagini in background e poi te le visualizza... è da studiare.
Tu che dici ?
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #9 (permalink)  
Old 03-06-08, 16:14
Junior Member
 
Join Date: May 2008
Posts: 2
Rep Power: 0
maiocchino is on a distinguished road
Re: Zoom con Flash CS3

Grazie per la tua risposta!
Io ho ancora poca esperienza di AS3, per il momento lavoro ancora con AS2.
Pero' mi sembra che nell'esempio venga usato il metodo merge(). Forse l'idea e' quella di caricare le immagini e fare un merge tra due immagini successive quando si supera un certo valore di zoom.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #10 (permalink)  
Old 04-06-08, 06:45
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,356
Blog Entries: 1
Rep Power: 6
Flep is on a distinguished road
Re: Zoom con Flash CS3

Eh sì, potrebbe essere, anche se comunque le immagini sono da caricare...
__________________

 


I recommend: Essential Actionscript 3.0

- Non rispondo ai messaggi privati con domande tecniche. Apri una discussione sul forum !
- I do not reply technicians pvt messages. Open a thread !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump

Similar Threads

Thread Thread Starter Forum Replies Last Post
[FLASH 8] zoom relativo al click rtank Actionscript 3.0 base 10 01-04-08 12:18
Zoom with Flash CS3 Flep Tutorials 0 09-10-07 18:38


All times are GMT. The time now is 05:31.


Powered by vBulletin versione 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0 RC4
Forum SiteMap


FlepStudio
by Filippo Lughi
P.IVA 03605860406