AS3 - добавление eventListener в унаследованное свойство изнутри и снаружи класса - PullRequest
0 голосов
/ 26 декабря 2011

Читая книгу, я наткнулся на этот пример:

Вот класс:

package com.learningactionscript3.loading {

import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;

public class CustomLoader extends Loader {

    private var _ldrInfo:LoaderInfo;
    private var _path:String;
    private var _verbose:Boolean = false;
    private var _loadedPercent:Number = 0;
    //constructor
    public function CustomLoader(path:String="", 
                                 verbose:Boolean=false) {
        _path = path;
        _verbose = verbose;

        addListeners();

        if (path != null) {
            try {
                this.load(new URLRequest(path));
            } catch (err:Error) {
                trace("Cannot load", _path, err.message);
            }
        }
    }
    //listeners
    private function addListeners():void {
        _ldrInfo = this.contentLoaderInfo;
        _ldrInfo.addEventListener(Event.OPEN,
                                  onOpen, false, 0, true);
        _ldrInfo.addEventListener(ProgressEvent.PROGRESS,
                                  onProgress, false, 0, true);
        _ldrInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS,
                                  onStatusEvent, 
                                  false, 0, true);
        _ldrInfo.addEventListener(Event.INIT,
                                  onInit, false, 0, true);
        _ldrInfo.addEventListener(Event.COMPLETE,
                                  onComplete, false, 0, true);
        _ldrInfo.addEventListener(IOErrorEvent.IO_ERROR,
                                  onIOError, false, 0, true);
        _ldrInfo.addEventListener(Event.UNLOAD,
                                  onUnloadContent, 
                                  false, 0, true);
    }

    public function removeListeners():void {
        _ldrInfo.removeEventListener(Event.OPEN, onOpen);
        _ldrInfo.removeEventListener(ProgressEvent.PROGRESS,
                                     onProgress);
        _ldrInfo.removeEventListener(HTTPStatusEvent.HTTP_STATUS,
                                     onStatusEvent);
        _ldrInfo.removeEventListener(Event.INIT, onInit);
        _ldrInfo.removeEventListener(Event.COMPLETE, 
                                     onComplete);
        _ldrInfo.removeEventListener(IOErrorEvent.IO_ERROR, 
                                     onIOError);
        _ldrInfo.removeEventListener(Event.UNLOAD, 
                                     onUnloadContent);
    }
    //listener methods, getter, and setter
    private function onOpen(evt:Event):void {
        if (_verbose) { trace("Loading begun:", _path); }
    }

    private function onProgress(evt:ProgressEvent):void {
        _loadedPercent = evt.bytesLoaded/evt.bytesTotal;

        if (_verbose) { 
            trace("Loading", _path, 
                  "-- progress (0-1):", _loadedPercent);
        }
    }

    private function onStatusEvent(evt:HTTPStatusEvent):void {
        if (_verbose) { trace("HTTP status:", evt.status); }
    }

    private function onInit(evt:Event):void {
        if (_verbose) { 
            trace("Content initialized. Properties:"); 
            trace("  url:", evt.target.url)
            trace("  Same Domain:", evt.target.sameDomain)
            if (evt.target.contentType == 
                "application/x-shockwave-flash") {
                trace("  SWF Version:", evt.target.swfVersion)
                trace("  AS Version:", 
                      evt.target.actionScriptVersion)
                trace("  Frame Rate:", evt.target.frameRate)
            }
        }
    }

    private function onComplete(evt:Event):void {
        if (_verbose) { trace("Loading complete:", _path); }
    }

    private function onUnloadContent(evt:Event):void {
        if (_verbose) { trace("Unloaded:", _path); }
    }

    private function onIOError(evt:IOErrorEvent):void {
        trace("Loading error:\n", evt.text);
    }

    public function get percentLoaded():Number {
        return _loadedPercent;
    }

    public function set verbose(bool:Boolean):void {
        _verbose = bool;
    }
}

}

проблема в этой строке:

_ldrInfo = this.contentLoaderInfo;

Несколько слушателей событий добавлено внутри этого свойства ... и теперь все в порядке.

Теперь в кадре FLA-файла (где создается этот класс) и добавляется новый eventListener, с тем же именем, что и для внутреннего создания:

var swfLoader: CustomLoader = new CustomLoader ("swfToLoad.swf", true); AddChild (SWFLoader);

swfLoader.contentLoaderInfo.addEventListener (Event.COMPLETE, OnComplete, false, 0, true);

Из этого примера я могу сделать вывод, что swfLoader.contentLoaderInfo и _ldrInfo = this.contentLoaderInfo ссылаются на один и тот же объект в одной и той же ячейке памяти. Поэтому вы можете подумать: «хорошо, последнее добавленное событие перезапишет первое (внутренне добавленное). Но это не так. Два слушателя событий будут отвечать последовательно. Сначала внутренний слушатель, а затем внешний слушатель. Как это возможно?

1 Ответ

2 голосов
/ 26 декабря 2011

Почему бы и нет? Вы можете добавить столько слушателей, сколько хотите для одного типа события. Они не перекрывают друг друга. Чтобы удалить слушателя, используйте метод removeEventListener . Для управления вызывающей последовательностью используйте параметр priority.

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

priority: int (default = 0) - Уровень приоритета прослушивателя событий. Приоритет обозначается 32-разрядным целым числом со знаком. Чем выше число, тем выше приоритет. Все слушатели с приоритетом n обрабатываются перед слушателями с приоритетом n-1. Если два или более слушателей имеют одинаковый приоритет, они обрабатываются в том порядке, в котором они были добавлены. Приоритет по умолчанию - 0.

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