2010-09-25 6 views
4

Я пытаюсь найти правильный код as3 для изменения размера изображения, когда он динамически вызывается на сцену и помещается в MC. Я загрузка с помощью:Как изменить размер динамически загружаемого изображения на flash (as3)

var myLoader :Loader = new Loader(); 
mc.addChild(myLoader); 
var url :URLRequest = new URLRequest("myimage.jpg"); 
myLoader .load(url); 

этапа постепенно откроет в полноэкранный режим (работает нормально), поэтому мне нужно, чтобы сохранить изображение в оригинальном размере, который намного больше, чем на сцене.

Что мне нужно сделать, это сжать его при загрузке на ту же высоту, что и на этапе, сохраняя при этом ширину (о и центрировать). Я пробовал всевозможные коды, но не мог найти что-либо для работы, поскольку все, что мне удалось сделать, это изменить размер MC, содержащего изображение, но НЕ изображение. Любое руководство относительно правильного кода будет принята с благодарностью.

Я guessng это так просто, как что-то вроде

"myimage".x=600; 

, но если это так, что это правильный способ, чтобы написать имя изображения, как я уже писал, кажется ошибочным. Большое спасибо

Ed

ответ

0

вам нужно добавить слушателя слушать для случая INIT на то, что вы загружаете.

И вам не нужно изменять размер самого файла image.jpg (и способ, которым вы пытаетесь обратиться к нему, не будет работать). Вы можете изменить размер загрузчика.

Если вы заходите в AS3 Docs for LoaderInfo, в конце вы найдете пример, показывающий, как добавить слушателей. (Обратите внимание, что слушатель добавляется к объекту contentLoaderInfo, а не самому загрузчику).

Затем вы можете использовать обработчик событий для изменения размера. В Документах AS3 показан пример в initHandler, который просто отслеживает некоторые вещи. Если вы загрузили loader.x = 600, вы получите то, что вам нужно.

+0

HI Stray Большое спасибо за ваш ответ и поставили меня в правильном направлении. – Edbro

3

Вы должны ждать загрузки изображения, а затем вы можете изменить размер загрузчика, например:

package { 
import flash.display.MovieClip; 
import flash.display.Sprite; 

import flash.display.DisplayObject; 
import flash.display.Loader; 
import flash.display.LoaderInfo; 
import flash.events.Event; 

public class Test extends Sprite { 

    public function Test(){ 
    super(); 

    if (stage) { 
     init(); 
    } else { 
    addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true); 
    } 
    } 

    public var mc:MovieClip; 

    private function init(e:Event=null):void{ 
    if (e!=null) { 
    e.target.removeEventListener(e.type, arguments.callee); 
    } 

    mc = new MovieClip(); 
    addChild(mc); 

    var myLoader:Loader = new Loader(); 
    mc.addChild(myLoader); 

    // listen when the image is fully loaded 
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded); 


    var url :URLRequest = new URLRequest("myimage.jpg"); 
    myLoader.load(url); 
    } 

    private function onImageLoaded(e:Event):void { 
    var li:LoaderInfo = e.target as LoaderInfo; 
    li.removeEventListener(e.type, arguments.callee); 

    // resize the loader while preserving ratio 
    var ldr:Loader=li.loader; 
    var mw:Number = stage.stageWidth/ldr.width; 
    var mh:Number = stage.stageHeight/ldr.height; 

    var ratio:Number = (mw < mh) ? mw : mh; 

    ldr.width *= ratio; // you can also use ldr.scaleX=ratio; 
    ldr.height *= ratio; // you can also use ldr.scaleY=ratio; 

    // center mc on stage 
    mc.x=0.5*(stage.stageWidth-mc.width); 
    mc.y=0.5*(stage.stageHeight-mc.height); 
    } 
} 
} 
+0

Большое спасибо Patrick – Edbro

+0

Hi Patrick см. Мой ответ ниже – Edbro

2

Вы также можете попробовать классы грузчика в
http://www.greensock.com/loadermax/

Они делают большую работу упрощая &, упрощающий процесс загрузки, с несколькими хорошими привилегиями поверх всего.

Проверьте ImageLoader класс http://www.greensock.com/as/docs/tween/com/greensock/loading/ImageLoader.html

в частности, как можно установить кучу необязательных вары свойства перед загрузкой.

Вот небольшая выдержка из примера, приведенного в документах ...

 
//create an ImageLoader: 
var loader:ImageLoader = new ImageLoader("img/photo1.jpg", 
//here's the sweet part :) 
{name:"photo1", 
container:this, 
x:180, 
y:100, 
width:200, //here you could set the stageWidth for instance 
height:150, //and the stageHeight here 
scaleMode:"proportionalInside", //this one will definitely help you , check the docs! 
centerRegistration:true, 
onComplete:onImageLoad}); 

+0

Большое спасибо за ваш вход Patrick – Edbro

+0

Мое удовольствие! ...;) – PatrickS

1

я имел нагрузки ошибок с указанным кодом, по-видимому, говорит, не можешь использовать вложенный общественный класс или soemthing, так что я удалил пакет и общественные функции, и я получил его работу с этим кодом

 import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.display.DisplayObject; 
import flash.display.Loader; 
import flash.display.LoaderInfo; 
import flash.events.Event; 
    var myLoader:Loader = new Loader(); 
    mc.addChild(myLoader); 
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded); 
    var url :URLRequest = new URLRequest("im1.jpg"); 
    myLoader.load(url); 
function onImageLoaded(e:Event):void { 
    var bit:Bitmap = e.target.content; 
    if(bit != null) 
    bit.smoothing = true; 
    var li:LoaderInfo = e.target as LoaderInfo; 
    li.removeEventListener(e.type, arguments.callee); 
    var ldr:Loader=li.loader; 
    var mw:Number = stage.stageWidth/ldr.width; 
    var mh:Number = stage.stageHeight/ldr.height; 
    var ratio:Number = (mw < mh) ? mw : mh; 
    ldr.width *= ratio; // you can also use ldr.scaleX=ratio; 
    ldr.height *= ratio; // you can also use ldr.scaleY=ratio; 
    mc.x=0.5*(stage.stageWidth-mc.width); 
    mc.y=0.5*(stage.stageHeight-mc.height); 
    } 

Даже добавил некоторые сглаживания там. Мне нужно учиться «Потому что я не уверен, какая разница между публичными и частными функциями?

Одна еще одна проблема, ребята, я могу успешно динамически загружать изображения, если они находятся в той же папке, что и SWF, который загружает их, но если я пытаюсь держать изображения в отдельном файле и вызывать их с чем-то вроде

var url: URLRequest ... и т. Д. ("Stills/image1.jpg"); они просто не загрузятся. Что-нибудь не так?

раз большое спасибо за помощь

Ed

+0

Вы должны проверить свой путь, зависит от того, где находится ваш каталог изображений под тем же SWF-каталогом или выше, если выше, вам нужно добавить «../» на ваш путь, чтобы получить один уровень вверх – Patrick

+0

То, что я думал, но не смог получить его правильно. Папки выглядят следующим образом: Внутри CLIENTfolder ... У меня есть MY_swf_file (что загружает изображения) STILLSfolder ... внутри это изображения im1.jpg, im2.jpg и т. д. поэтому, когда я вызываю изображения в файл My_swf_file, это не должно быть «STILLS/im1.jpg» и т. д. или мне нужно «../STILLS/Im1.jpg ?? – Edbro

+0

Также это может помочь, если вы запустили swf-файл через IIS или Apache, поскольку просто запуск swf из компиляции - это не то же самое, что запускать его с сервера. Некоторые вещи не работают при запуске swf localy, это может быть одной из этих вещей. – MrB

9

Я пытаюсь ответить на ваши вопросы

import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.display.DisplayObject; 
import flash.display.Loader; 
import flash.display.LoaderInfo; 
import flash.events.Event; 

    var myLoader:Loader = new Loader(); 
    var image:Bitmap; 
    var url :URLRequest = new URLRequest("im1.jpg"); 
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded); 
    myLoader.load(url); 

    function onImageLoaded(e:Event):void { 
     image = new Bitmap(e.target.content.bitmapData); 
     var mw:Number = stage.stageWidth; 
     var mh:Number = stage.stageHeight; 
     /* if you set width and height image same with the stage use this */ 
     image.width = mw; 
     image.height = mh; 
     mc.addChild(image); 
    } 
0

Я просто смотрел вверх, как изменить размер изображения, и я нашел эту удобную библиотеку http://jacwright.com/blog/221/high-quality-high-performance-thumbnails-in-flash/

, когда вспышка уменьшает изображение, оно имеет наилучшее качество при изменении размера его на половину, а затем уменьшайте размер до половины, пока вы не добраться до нужного размера

библиотека делает все, что для вас

сайт имеет некоторые примеры и ссылки на его странице Google Code

не может быть именно то, что вы хотите, но это действительно работает очень хорошо

3

Попробуйте этот код:

img1_mc.scaleX = (stage.stageWidth/img1_mc.width) 
img1_mc.scaleY = (stage.stageHeight/img1_mc.height) 
0

Я боролся с этим на некоторое время люди, но если вы используете AS3, просто перетащите объект UILoader на т он стадии и установить его источник и самое главное, scaleContent свойство верно ....

Это работает очень хорошо для меня и требует меньше кода:

uiloader.autoLoad = true; 
uiloader.scaleContent = true; 
uiloader.source = "photos/yourphoto.jpg"; 
0

Я тоже были такие проблемы, вы можете попробовать это ..... это сработало для меня

var my_loader:Loader = new Loader(); 
     my_loader.load(new URLRequest("underwater.jpg")); 
     var holder:MovieClip=new MovieClip(); 
     my_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(){ 
my_loader.content.width = stage.stageWidth; 
my_loader.content.height = stage.stageHeight;