我有一个自定义Image
类,用于存储图库应用程序的单个图像信息:
package mtm.test
{
public class Image extends Object
{
public var id:int;
public var filename:String;
public var title:String;
public var description:String;
public var thumbExists:int;
public var mediumExists:int;
public var fullExists:int;
}
}
为了管理三种不同大小的位图,我创建了以下基类(BitmapType
)和三个子类(BitmapThumbnail
,BitmapMediumSize
,BitmapFullSize
):
package mtm.test
{
import flash.display.Bitmap;
import flash.display.BitmapData;
public class BitmapType extends Bitmap
{
public function BitmapType(bitmapData:BitmapData = null, pixelSnapping:String = 'auto', smoothing:Boolean = false)
{
super(bitmapData, pixelSnapping, smoothing);
}
}
}
package mtm.test
{
import flash.display.BitmapData;
public class BitmapFullSize extends BitmapType
{
public function BitmapFullSize(bitmapData:BitmapData = null, pixelSnapping:String = 'auto', smoothing:Boolean = false)
{
super(bitmapData, pixelSnapping, smoothing);
}
}
}
package mtm.test
{
import flash.display.BitmapData;
public class BitmapMediumSize extends BitmapType
{
public function BitmapMediumSize(bitmapData:BitmapData = null, pixelSnapping:String = 'auto', smoothing:Boolean = false)
{
super(bitmapData, pixelSnapping, smoothing);
}
}
}
package mtm.test
{
import flash.display.BitmapData;
public class BitmapThumbnail extends BitmapType
{
public function BitmapThumbnail(bitmapData:BitmapData = null, pixelSnapping:String = 'auto', smoothing:Boolean = false)
{
super(bitmapData, pixelSnapping, smoothing);
}
}
}
这就是我实现上述目的的方法:
var image:Image = new Image();
//I would be loading external bitmaps but for the example I'll just create new ones:
image[BitmapThumbnail] = new BitmapThumbnail(new BitmapData(65,65,false,0x000000));
image[BitmapMediumSize] = new BitmapMediumSize(new BitmapData(200,200,false,0x000000));
image[BitmapFullSize] = new BitmapFullSize(new BitmapData(500,500,false,0x000000));
有更简单的方法吗?我觉得BitmapType
子类中有很多重复的代码。
至少,这有助于避免一堆for循环试图找到所请求的大小,并且在需要更多或更少大小的位图的情况下它似乎是可移植的。
答案 0 :(得分:1)
您可以简单地使用缓存并按需填充它。这是草图:
class Image {
var url:String;
//... other stuff
var cache:Object = {};
function getImage(size:int, onDone:Function, onProgress:Function = null, onError:Function = null):void {
if (onProgress == null) onProgress = function (loaded:int, total:int):void {};
var cached:* = this.cache[size];
if (cache == null) {
var l:Loader = new Loader();
var req:URLRequest = new URLRequest(url)
//add parameters here, depending on size
l.load();
l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {
onError(cache[size] = e);
});
l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, function (p:ProgressEvent):void {
onProgress(p.byteLoaded, p.byteTotal);
});
l.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void {
onDone(cache[size] = l.content);
});
}
else if (cache is DisplayObject) {
onDone(cache);
}
else onError(cache);
}
}
假设示例用法:
myImage.getImage(ImageSize.THUMB, displayImage, updateLoader, displayBroken);