| ALiEN_2OO6 |
20.12.2006 17:55 |
Вот на скорую руку накидал:
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete = "initApp()">
<mx:Image x="10" y="10" width="711" height="606" id="myImage"/>
<mx:Script>
<![CDATA[
public function initApp():void {
var a = new StreamLoader(new URLRequest('http://lab.orangeflash.eu/flex2/examples/partialImageloader/Image2.jpg'));
myImage.addChild(a);
//myImage.scaleX = 0.1;
//myImage.scaleY = 0.1;
}
]]>
</mx:Script>
</mx:Application>
Код:
package
{
import flash.display.Loader;
import flash.events.*;
import flash.net.*;
import flash.utils.*;
import flash.system.LoaderContext;
[Event(name = "complete", type="flash.events.Event")]
[Event(name = "progress", type="flash.events.ProgressEvent")]
[Event(name = "open", type="flash.events.Event")]
[Event(name = "ioError", type="flash.events.IOErrorEvent")]
public class StreamLoader extends Loader
{
protected var stream:URLStream = new URLStream();
protected var bytes:ByteArray = new ByteArray();
protected var cont:LoaderContext;
import mx.core.UIComponent
/**
* Constructor, creates new StreamLoader
*
*/
public function StreamLoader(request:URLRequest = null)
{
if(request != null)
{
loadStream(request);
}
}
/**
* Method, loads images as stream
*
* @param request URLRequest
* @param context LoaderContext, default value is null
*/
public function loadStream(request:URLRequest, context:LoaderContext = null):void
{
cont = context;
stream.load(request);
stream.addEventListener(Event.COMPLETE,onStreamComplete);
stream.addEventListener(ProgressEvent.PROGRESS,onStreamProgress);
stream.addEventListener(Event.OPEN,onStreamOpen);
stream.addEventListener(IOErrorEvent.IO_ERROR,onStreamIOError);
stream.addEventListener(HTTPStatusEvent.HTTP_STATUS,onStreamHTTPStatus);
stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onStreamSecurityError);
}
/**
* @private
*/
private function onStreamComplete(event:Event):void
{
updateBytes();
dispatchEvent(new Event(event.type, event.bubbles, event.cancelable));
setTimeout(confirmBytesLoaded,1);
}
/**
* @private
*/
private function onStreamProgress(event:ProgressEvent):void
{
updateBytes();
if(bytes.length > 20000)stream.close();
dispatchEvent(new ProgressEvent(event.type, event.bubbles,
event.cancelable, event.bytesLoaded,
event.bytesTotal));
}
/**
* @private
*/
private function onStreamIOError(event:IOErrorEvent):void
{
dispatchEvent(new IOErrorEvent(event.type, event.bubbles, event.cancelable, event.text));
}
/**
* @private
*/
private function onStreamSecurityError(event:SecurityErrorEvent):void
{
dispatchEvent(new SecurityErrorEvent(event.type, event.bubbles, event.cancelable, event.text));
}
/**
* @private
*/
private function onStreamHTTPStatus(event:HTTPStatusEvent):void
{
dispatchEvent(new HTTPStatusEvent(event.type, event.bubbles, event.cancelable, event.status));
}
/**
* @private
*/
private function onStreamOpen(event:Event):void
{
dispatchEvent(new Event(event.type, event.bubbles, event.cancelable));
}
/**
* @private
*/
private function updateBytes():void
{
stream.readBytes(bytes, bytes.length);
if(bytes.length > 0)
{
loadBytes(bytes,cont);
}
}
/**
* @private
*
* Method confirms that all bytes loaded, and closes stream
*/
private function confirmBytesLoaded():void
{
updateBytes();
stream.close();
}
}
}
В данном примере, я просто обрубаю поток, по достижении 20000 загруженных байт. Т.к. Евент срабатывает с разной периодичностью, рекомендую потыкать F5 в примере, и посмотреть что именно загружается в myImage. Поставленная задача решена. Единственное конечно надо это до ума довести, например, что бы четко срабатывал евент на определенном этапе, а не так как сейчас.
|