Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передать параметры в обработчик события (http://www.flasher.ru/forum/showthread.php?t=142045)

zemozes 11.07.2010 07:48

Передать параметры в обработчик события
 
Передать параметры в обработчик события.
Скрипт грузит небольшие фотки (75*75, миниатюры) с сайта, как только фотка загрузилась,
то создаётся bmpd: BitmapData, в нём рисуется фотка,
потом содаётся var bmp:Bitmap=new Bitmap(bmpd) и tmp_mc:MovieClip.
Далее tmp_mc становится слушателем события MouseEvent.CLICK
и когда оно наступает, то сдвигается вправо (и он сдвигается).
После этого код tmp_mc.addChild(bmp) этим я добавляю фотку к мувиклипу.
Далее addChild(tmp_mc) чтобы мувик был виден.

Такие образом: один мувик это одна фотка.
Сайт хранит одну фотку в разных разрешениях.
Короче на экране пользователь увидит миниатюры фоток,
кликнув по которым откроется фотка в более высоком разрешении.
Нужно чтобы при клике мышью по мувику, в центре экрана создавалось поле,
в него загружалась фотка более высокого разрешения.
Для этого надо чтобы при создании мувика ему было присвоено свойство
tmp_mc.image_url = "http://site.ru/image_big_4.jpg" (четыре это номер фотки).
Вот как раз передать строку image_url в обработчик события неполучается.

Код AS3:

var tf:TextField = new TextField();
tf.x = 100;
tf.y = 10;
tf.autoSize = "left";
tf.text = "testsdfwefwef";
addChild(tf);
 
var q:Number = 0;
 
function onLoadAva(e:Event) : void
                        {
//var loaderInfo:LoaderInfo = e.target as LoaderInfo;
//var dispObj:DisplayObject = loaderInfo.content;
var bmpd:BitmapData = new BitmapData (e.target.content.width, e.target.content.height,false);
bmpd.draw(e.target.content,null,null,null,null,true);
var bmp:Bitmap=new Bitmap(bmpd);
bmp.width=75;bmp.height=75;
bmp.smoothing=true;
bmp.pixelSnapping = PixelSnapping.ALWAYS;
tf.text = String(e.target.content);
var tmp_mc:MovieClip = new MovieClip();
tmp_mc.addEventListener(MouseEvent.CLICK,
                                                function (e:Event):void
                                                {
                                                        e.target.x+=50;
                                                        tf.text = tmp_mc.x.toString();
                                                        /*var canvas:Sprite = new Sprite();
                                                        canvas.graphics.lineStyle(5, 0xFFD700, 1, false, LineScaleMode.VERTICAL,
                                                                CapsStyle.NONE, JointStyle.MITER, 10);
                                                        canvas.graphics.moveTo(e.target.x, e.target.y);
                                                        canvas.graphics.lineTo(e.target.width, e.target.y);
                                                        addChild(canvas);*/

                                                });
                                tmp_mc.addChild(bmp);
                                tmp_mc.x = 100*q;
                                tmp_mc.y = 40;
                                tmp_mc.width=75;tmp_mc.height=75;
                                //tmp_mc.scaleX=0.75;tmp_mc.scaleY=0.75;
                                tmp_mc.graphics.lineStyle(1, 0x000000, 1);
                                tmp_mc.graphics.lineTo(tmp_mc.width, 0);
                                tmp_mc.graphics.lineTo(tmp_mc.width, tmp_mc.height);
                                tmp_mc.graphics.lineTo(0, tmp_mc.height);
                                tmp_mc.graphics.lineTo(0, 0);
                                addChild(tmp_mc);
                                q = q+1;
                                //tf.text = "q="+q+"\r";
                        }
 
 
                for (var i:Number = 0; i <= 10; i++)
{
                                var image_url:String = "http://site.ru/image_big_"+i+".jpg";
                                var loader:Loader = new Loader();
                                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadAva);
                                loader.load(new URLRequest(image_url));
};


wvxvw 11.07.2010 11:52

Не делайте так никогда. Этот вопрос задавали очень много раз - в поиск.
http://www.flasher.ru/forum/showthre...E1%FB%F2%E8%FF
http://www.flasher.ru/forum/showthre...E1%FB%F2%E8%FF
например.
И таких тем еще сотни были.

zemozes 11.07.2010 21:48

Поиском то я искал. LOLEvent не заработал, выдаёт ошибку.
http://www.flasher.ru/forum/showpost...9&postcount=11

Добавлено через 7 минут
Есть ещё одно решение, оно "как бы" не через задний проход.
создать функцию, которая потом будет вызывать нужную уже с параметрами, и вписать её в ивент лисенер.
http://www.flasher.ru/forum/showpost...0&postcount=11

это тоже не помогло

Добавлено через 16 минут
Сделал другим способом. Работает.

Код AS3:

var loaderInfo:LoaderInfo = e.target as LoaderInfo;
tmp_mc.image_url = loaderInfo.url;

Добавлено через 22 минуты
Но это не то, ведь loaderInfo.url это встроенная переменная.
А мне нужно передавать свои переменные.

Добавлено через 1 час 0 минут
Пробую сделать свой класс на основе loader - одни ошибки.

wvxvw 11.07.2010 22:50

Что такое встроенная переменная?
Не вижу ничего плохого в вызове другой функции.
Пока что через задний проход написан только код в первом сообщении.

zemozes 11.07.2010 23:02

Цитата:

Сообщение от wvxvw (Сообщение 921455)
Что такое встроенная переменная?
Не вижу ничего плохого в вызове другой функции.
Пока что через задний проход написан только код в первом сообщении.

>>>Что такое встроенная переменная?
Я имел ввиду переменная, объявленная в классе LoaderInfo

>>>Не вижу ничего плохого в вызове другой функции.
Я тоже ничего плохого в этом не вижу, пробовал так делать, не работает.

>>>Пока что через задний проход написан только код в первом сообщении
А что в нём не так?

Добавлено через 36 минут
Сделал класс Myloader на основе Loader, теперь работает.
С дополнительным полем public var server:String;
Код AS3:

package
{
        import flash.display.Loader;
 
        public class Myloader extends Loader
        {
                public var server:String;
 
                public function Myloader()
                {
                        super();
                }
        }
}

Использую его так
Код AS3:

import Myloader;
var myloader:Myloader = new Myloader();
myloader.server = server;
myloader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadAva);
myloader.load(new URLRequest(image_url));

Картинки загружает, но в функции onLoadAva пробую узнать значение свойства server
tmp_mc.image_url = e.target.server; и в этом случае картинки не показываются.
А если закомментировать строку tmp_mc.image_url = e.target.server;, то картинки показываются.

wvxvw 12.07.2010 00:03

Потому что должно было быть примерно так:
Код AS3:

import flash.display.Graphics;
const SITE_URL:String = "http://site.ru/image_big_";
const IMAGES_PER_PAGE:int = 10;
 
var field:TextField = new TextField();
field.x = 100;
field.y = 10;
field.autoSize = TextFieldAutoSize.LEFT;
field.text = "testsdfwefwef";
this.addChild(field);
 
var counter:int;
var imagesLoaded:int;
 
function completeHandler(event:Event):void
{
        var info:LoaderInfo = event.target as LoaderInfo;
        var bitmap:Bitmap = info.loader.content as Bitmap;
        var bmpd:BitmapData = bitmap.bitmapData.clone();
        var loader:Loader;
 
        var clone:Bitmap = new Bitmap(bmpd);
        clone.width = 75;
        clone.height = 75;
        clone.smoothing = true;
        clone.pixelSnapping = PixelSnapping.ALWAYS;
        field.text = String(bitmap);
 
        var container:MovieClip = new MovieClip();
        container.addEventListener(MouseEvent.CLICK, this.clickHandler);
        container.addChild(clone);
        container.x = 100 * counter;
        container.y = 40;
        container.width = 75;
        container.height = 75;
        var canvas:Graphics = container.graphics;
        canvas.lineStyle(1, 0, 1);
        canvas.drawRect(0, 0, container.width, container.height);
        this.addChild(container);
        counter++;
 
        if (imagesLoaded < IMAGES_PER_PAGE)
        {
                loader = new Loader();
                loader.contentLoaderInfo.addEventListener(
                        Event.COMPLETE, this.completeHandler);
                loader.load(new URLRequest(SITE_URL + imagesLoaded + ".jpg"));
                imagesLoaded++;
        }
}
 
function clickHandler(event:Event):void
{
        var clicked:DisplayObject = event.target as DisplayObject;
        if (clicked)
        {
                clicked.x += 50;
                field.text = clicked.x.toString();
        }
}

Если не вдаваться в подробности.

zemozes 12.07.2010 00:19

Какое событие передавать обработчику completeHandler?
Или просто completeHandler(null) ?

Nirth 12.07.2010 00:20

Код AS3:

loader.contentLoaderInfo.addEventListener(
                        Event.COMPLETE, this.completeHandler);

completeHandler вызовут сами, когда надо

zemozes 12.07.2010 00:22

Цитата:

Сообщение от Nirth (Сообщение 921470)
Код AS3:

loader.contentLoaderInfo.addEventListener(
                        Event.COMPLETE, this.completeHandler);

completeHandler вызовут сами, когда надо

Кто вызовет?

wvxvw 12.07.2010 00:24

Тогда так:
Код AS3:

const SITE_URL:String = "http://site.ru/image_big_";
const IMAGES_PER_PAGE:int = 10;
 
var field:TextField = new TextField();
this.field.x = 100;
this.field.y = 10;
this.field.autoSize = TextFieldAutoSize.LEFT;
this.field.text = "testsdfwefwef";
this.addChild(this.field);
 
var counter:int;
var imagesLoaded:int;
 
function completeHandler(event:Event):void
{
        var info:LoaderInfo = event.target as LoaderInfo;
        var bitmap:Bitmap = info.loader.content as Bitmap;
        var bmpd:BitmapData = bitmap.bitmapData.clone();
 
        var clone:Bitmap = new Bitmap(bmpd);
        clone.width = 75;
        clone.height = 75;
        clone.smoothing = true;
        clone.pixelSnapping = PixelSnapping.ALWAYS;
        this.field.text = String(bitmap);
 
        var container:MovieClip = new MovieClip();
        container.addEventListener(MouseEvent.CLICK, this.clickHandler);
        container.addChild(clone);
        container.x = 100 * this.counter;
        container.y = 40;
        container.width = 75;
        container.height = 75;
 
        var canvas:Graphics = container.graphics;
        canvas.lineStyle(1, 0, 1);
        canvas.drawRect(0, 0, container.width, container.height);
        this.addChild(container);
        this.counter++;
 
        if (imagesLoaded < IMAGES_PER_PAGE) this.loadNext();
}
 
function loadNext():void
{
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(
                Event.COMPLETE, this.completeHandler);
        loader.load(new URLRequest(SITE_URL + this.imagesLoaded + ".jpg"));
        this.imagesLoaded++;
}
 
function clickHandler(event:Event):void
{
        var clicked:DisplayObject = event.target as DisplayObject;
        if (clicked)
        {
                clicked.x += 50;
                this.field.text = clicked.x.toString();
        }
}



Часовой пояс GMT +4, время: 23:13.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.