URLStream 土片适时
2009-10-14 23:11 宝宝合凤凰 阅读(569) 评论(3) 收藏 举报stage.scaleMode = "noScale"
var image0:Loader = new Loader();
addChild(image0)
var image1:Loader = new Loader();
addChild(image1)
var current:uint=0;
var loaded:Boolean = false;
var by:ByteArray = new ByteArray();
var loader:URLStream = new URLStream()
loader.addEventListener(Event.COMPLETE,_complete)
loader.load(new URLRequest("image.jpg"))
addEventListener(Event.ENTER_FRAME,showImage)
function _complete(e:Event):void
{
loaded = true
}
function showImage(e:Event):void
{
if(loader.bytesAvailable==0)return;
loader.readBytes(by,by.length,loader.bytesAvailable);
this["image"+(++current%2)].loadBytes(by);
addChild(this["image"+current%2])
if(loaded)loader.removeEventListener(Event.COMPLETE,_complete)
}
=====================
//Hi this is a code for load high res images using the bites info... I want to know how aply this code to load an //image in a low quality and see how the image is comming better
import flash.net.URLRequest;
import flash.utils.getTimer;
//==================================================================================================
// Declaración de variables
//==================================================================================================
var loader:Loader;
var imageStream:URLStream;
var imageData:ByteArray;
addEventListener(Event.ENTER_FRAME, moveImage);
//==================================================================================================
// Función constructora
//==================================================================================================
function init():void {
imageStream = new URLStream();
imageStream.addEventListener( ProgressEvent.PROGRESS , imageStreamProgress );
imageStream.addEventListener( Event.COMPLETE , imageStreamComplete );
loader = new Loader();
addChild( loader );
}
function moveImage(e:Event):void{
loader.x=0;
loader.y=0;
}
function imageStreamProgress( event:Event ):void {
if ( imageStream.bytesAvailable == 0 ) {
return;
}
this.processImageData();
}
function imageStreamComplete( event:Event ):void {
if ( imageStream.connected ) {
imageStream.close();
}
}
function processImageData():void {
if ( imageStream.connected ) {
imageStream.readBytes( imageData , imageData.length );
}
loader.unload();
loader.loadBytes( imageData );
}
function loadImage( input:String ):void {
if ( imageStream.connected ) {
imageStream.close();
}
imageStream.load( new URLRequest( input + '?' + getTimer() ) );
loader.unload();
imageData = new ByteArray();
}
init();
loadImage(http://fc03.deviantart.com/fs26/f/2008/095/1/5/They_Stole_The_Moon_Version_2_by_vladstudio.jpg);
============================
package cn.lite3.net
{
import flash.display.LoaderInfo;
import flash.errors.IOError;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.system.LoaderContext;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.utils.ByteArray;
/**
* 渐进式加载类
* 用法跟Loader一样,
* <p><b>不同点:</b></p>
* 1.当加载流错误时只能获取到 "Error #2124: 加载的文件为未知类型。" <br/>
* 2.侦听contentLoaderInfo的Progress事件的bytesLoaded,bytesTotal是整个文件的已加载字节和总字节.<br/>
* 3.contentLoaderInfo.bytesLoaded, contentLoaderInfo.bytesTotal指当前loader里的字节数和总字节
*
* @author lite3
*/
public class ProgressiveLoader extends Loader
{
private var bytesLoaded:uint = 0; // 已加载的字节数
private var bytesToal:uint = 0; // 总字节数
private var dataChange:Boolean = false; // buffer的数据是否改变
private var streamComplete:Boolean = false; // 文件是否加载完成
private var context:LoaderContext; //
private var buffer:ByteArray; // 数据缓存
private var stream:URLStream; // 流
/**
* 关闭流,并清理所有侦听器
*/
override public function close():void
{
// 清除流相关
if (stream)
{
if (stream.connected) stream.close();
streamRemoveEvent(stream);
}
// 清除conentLoaderInfo相关的事件
if (contentLoaderInfo.hasEventListener(Event.COMPLETE))
{
loaderInfoRemoveEvent(super.contentLoaderInfo);
}
// 清除显示数据事件
if (hasEventListener(Event.ENTER_FRAME))
{
removeEventListener(Event.ENTER_FRAME, showData);
}
buffer = null;
}
/**
* 加载字节数据,不会在内部触发contentLoaderInfo相关事件
* @param bytes
* @param context
*/
override public function loadBytes(bytes:ByteArray, context:LoaderContext = null):void
{
close();
super.unload();
super.loadBytes(bytes, context);
}
/**
* 加载一个url文件,并渐进显示(如果是渐进格式)
* @param request
* @param context
*/
override public function load(request:URLRequest, context:LoaderContext = null):void
{
streamComplete = false;
if (!stream) stream = new URLStream();
if (stream.connected) stream.close();
this.context = context;
dataChange = false;
buffer = new ByteArray();
super.unload();
addEventListener(Event.ENTER_FRAME, showData);
loaderInfoAddEvent(super.contentLoaderInfo);
streamAddEvent(stream);
stream.load(request);
}
// 将缓存中的数据显示为图像
private function showData(e:Event = null):void
{
if (!dataChange || !stream.connected) return;
dataChange = false;
if (stream.bytesAvailable > 0)
{
stream.readBytes(buffer, buffer.length, stream.bytesAvailable);
}
if (buffer.length > 0)
{
super.unload();
super.loadBytes(buffer, context);
}
// 加载完成
if (streamComplete)
{
close();
streamComplete = false;
}
}
// 修正contentLoaderInfo的ProgressEvent.PROGRESS事件的进度值
private function loaderProgressHandler(e:ProgressEvent):void
{
e.bytesLoaded = bytesLoaded;
e.bytesTotal = bytesToal;
}
// 显示完成
private function loaderCompleteHandler(e:Event):void
{
if (streamComplete)
{
streamComplete = false;
loaderInfoRemoveEvent(super.contentLoaderInfo);
}else
{
e.stopImmediatePropagation();
}
}
// 数据加载完成
private function streamCompleteHandler(e:Event):void
{
streamRemoveEvent(stream);
// 这里不删除EnterFrame事件,最后一段总是不会显示,
// 并且complete事件里showData也不行,
// 所以最后延时显示一次,
streamComplete = true;
dataChange = true;
}
// 数据加载中,保存数据加载的值
private function streamProgressHandler(e:ProgressEvent):void
{
bytesLoaded = e.bytesLoaded;
bytesToal = e.bytesTotal;
dataChange = true;
}
// 数据流错误, 但是也会加载400K左右的数据,
// 然后由contentLoaderInfo抛出IOError或者IOErrorEvent
// 但不会是流错误,而是未知文件类型
private function streamErrorHandler(e:IOError):void
{
close();
}
private function streamAddEvent(stream:URLStream):void
{
stream.addEventListener(Event.COMPLETE, streamCompleteHandler);
stream.addEventListener(ProgressEvent.PROGRESS, streamProgressHandler);
stream.addEventListener(IOErrorEvent.IO_ERROR, streamErrorHandler);
}
private function streamRemoveEvent(stream:URLStream):void
{
stream.removeEventListener(Event.COMPLETE, streamCompleteHandler);
stream.removeEventListener(ProgressEvent.PROGRESS, streamProgressHandler);
stream.removeEventListener(IOErrorEvent.IO_ERROR, streamErrorHandler);
}
private function loaderInfoAddEvent(loaderInfo:LoaderInfo):void
{
loaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler, false, int.MAX_VALUE);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, loaderProgressHandler, false, int.MAX_VALUE);
}
private function loaderInfoRemoveEvent(loaderInfo:LoaderInfo):void
{
loaderInfo.removeEventListener(Event.COMPLETE, loaderCompleteHandler);
loaderInfo.removeEventListener(ProgressEvent.PROGRESS, loaderProgressHandler);
}
}
浙公网安备 33010602011771号