webForumDet fria alternativet

Få bild att anpassa storlek

Flash

6 svar · 502 visningar · startad av silfver

Medlem sedan apr. 200312 679 inlägg
Frågan#1

Jag har den här koden som läser in en bild i ett movieclip jag gjort:

x.onLoad = function() {
	var images:Array = this.firstChild.childNodes;
	for(i=0;i<images.length;i++) {
		urls.push(images[i].attributes.url);
		captions.push(images[i].attributes.caption);
	}
	holder.loadMovie(urls[0]);
	caption.text = captions[0];
	current = 0;
}

Problemet är att själva rutan är 800x600 pixlar. Läser jag in en stor bild, låt säga 1280x1024 så ser jag ju bara en bråkdel av bilden.

Hur ska man skriva så att bilden anpassar sig till 800x600? Jag vill inte sätta måttet på bilden till 800x600 så att proportionerna blir fel utan jag vill fortfarande få samma proportioner i bilden.

Förstår ni hur jag menar? :)

Medlem sedan maj 2005704 inlägg
#2

Först och främst bör du köra MovieClipLoader för att kunna kolla när bilden laddat...den måste vara laddad innan du kan kolla storlek.
Lite kod:

var my_mcl:MovieClipLoader=new MovieClipLoader();
var myListener:Object = new Object();
myListener.owner=this;
myListener.onLoadInit = function (target_mc:MovieClip) {
	var imgW:Number=800;
	var imgH:Number=600;
	if (w>imgW) {
		xPc = (w*100)/imgW;
	}
	if (h>imgH) {
		yPc = (h*100)/imgH;
	}
	if (xPc>yPc) {
		target_mc._width /= (xPc/100);
		target_mc._height /= (xPc/100);
	} else {
		target_mc._width /= (yPc/100);
		target_mc._height /= (yPc/100);
	}
};
my_mcl.addListener(myListener);
my_mcl.loadClip(url, holder);

En liten varning....om du publicerar för Flash 8 kan bilderna se lite fula ut då de skalas om du inte omvandlar de till ett bitmap object med smoothing.
Lite info om problemet och kod för att lösa det:
http://www.kaourantin.net/2005/12/dynamically-loading-bitmaps-with.html

Medlem sedan apr. 200312 679 inlägg
#3

Tack för koden! Men jag får det inte riktigt att fungera. Vart skall den appliceras? Detta är all min kod:

var x:XML = new XML();
x.ignoreWhite = true;

var urls:Array = new Array();
var captions:Array = new Array();
var current:Number;

x.onLoad = function() {
	var images:Array = this.firstChild.childNodes;
	for(i=0;i<images.length;i++) {
		urls.push(images[i].attributes.url);
		captions.push(images[i].attributes.caption);
	}
	holder.loadMovie(urls[0]);
	caption.text = captions[0];
	current = 0;
}

x.load("images.xml");

previous.onRelease = function() {
	if(current > 0) {
		current--;
		holder.loadMovie(urls[current]);
		caption.text = captions[current];
	}
}

next.onRelease = function() {
	if(current < urls.length-1) {
		current++;
		holder.loadMovie(urls[current]);
		caption.text = captions[current];
	}
}
Medlem sedan apr. 200312 679 inlägg
#4

Några förslag?

Medlem sedan maj 2005704 inlägg
#5

Kanske detta funkar:

var x:XML = new XML();
x.ignoreWhite = true;

var urls:Array = new Array();
var captions:Array = new Array();
var current:Number;
var imgNum:Number;

x.onLoad = function() {
	var images:Array = this.firstChild.childNodes;

	for(i=0;i<images.length;i++) {
		urls.push(images[i].attributes.url);
		captions.push(images[i].attributes.caption);
	}
 	loadImg(0);
	caption.text = captions[0];
	current = 0;
	imgNum=0;
}

x.load("images.xml");
function loadImg(num:Number){
var my_mcl:MovieClipLoader=new MovieClipLoader();
var myListener:Object = new Object();
myListener.owner=this;
myListener.num=num;
myListener.onLoadInit = function (target_mc:MovieClip) {
	var imgW:Number=800;
	var imgH:Number=600;
	if (w>imgW) {
		xPc = (w*100)/imgW;
	}
	if (h>imgH) {
		yPc = (h*100)/imgH;
	}
	if (xPc>yPc) {
		target_mc._width /= (xPc/100);
		target_mc._height /= (xPc/100);
	} else {
		target_mc._width /= (yPc/100);
		target_mc._height /= (yPc/100);
	}
	this.owner.caption.text = this.owner.captions[this.num];
	this.owner.loadImg(this.owner.currImg);
};
my_mcl.addListener(myListener);
my_mcl.loadClip(urls[num], holder);
currImg++;
}
previous.onRelease = function() {
	if(current > 0) {
		current--;
		holder.loadMovie(urls[current]);
		caption.text = captions[current];
	}
}

next.onRelease = function() {
	if(current < urls.length-1) {
		current++;
		holder.loadMovie(urls[current]);
		caption.text = captions[current];
	}
}
Medlem sedan apr. 200312 679 inlägg
#6

Fungerar inte. :(

Medlem sedan maj 2005704 inlägg
#7

Inte så konstigt då jag ser att jag kallade variabeln "imgNum" för "currImg" i loadImg funktionen. Prova och byt ut dem och om det inte funkar berätta gärna vad som händer och eventuella felmeddelanden.

262 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)