2010-07-22 38 views
1

我有我使用的存儲圖庫應用單獨的圖像信息定製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)和三個子 - 班(BitmapThumbnailBitmapMediumSizeBitmapFullSize):

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循環試圖找到所請求的大小,似乎移植到那裏需要更多或更少的位圖的大小的情況。

回答

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); 
+0

這是一個好主意。我的意思是「尺寸」中的尺寸,但我應該更具體。我想可以肯定的是,較大的(尺寸)圖像將具有較大的文件大小,所以這可能會起作用! – 2010-07-22 15:45:01

+1

@letseatfood:可以做些如'尺寸= [{寬度:50,高度:50},{寬度:100,尺寸:100},...]'和讓'size'簡單地是一個索引到該陣列。 – back2dos 2010-07-22 16:18:21

+0

@ back2dos - 您的解決方案是真正偉大的,但由於字節大小或維度不會爲我的工作指標(尺寸是可變的),我結束了創建一個'尺寸:Object'財產在我的'Image'類,然後是擴展Object的'ImageSizes'類。然後我在'ImageSizes'中創建了一些常量,並使用這些常量來索引不同的圖像大小。 – 2010-07-22 17:43:51

相關問題