我正在爲Flash Pro中的平板電腦構建一個簡單電子書。所有的頁面都是圖像(庫中的位圖),其中大約有80個。爲了保持大片的質量,位圖非常大(3999x2999)。AS3 AIR:將大型位圖添加到舞臺時的加載時間
這本電子書有垂直和水平滾動,這些工作正常,但;由於這些圖片的數量和尺寸很大,我無法在應用程序啓動時將其全部添加到舞臺中,因此我最終只在滾動補間後纔將最接近的頁面添加到當前頁面。 這工作正常,但會導致頁面滾動後總是延遲(舊平板電腦甚至幾秒鐘,而新的iMac幾乎是1秒,所以它是值得注意的)。這是basicly我每做圖像/頁:
var bitmapdata:BitmapData = new bitmapArray[i](); //linkage name
var hRatio:Number = stage.stageHeight/bitmapdata.height;
var bitmap:Bitmap = BitmapScaled(bitmapdata, bitmapdata.width * hRatio, bitmapData.height * hRatio);
target.addChild(bitmap); //target is a MovieClip (I have one Mc for each vertical pile of pages)
而且BitmapScaled功能:
function BitmapScaled(source0:BitmapData, width0:Number, height0:Number):Bitmap{
var mat:Matrix = new Matrix();
mat.scale(width0/source0.width, height0/source0.height);
var bmpd_draw:BitmapData = new BitmapData(width0,height0,false);
bmpd_draw.drawWithQuality(source0,mat,null,null,null,true,StageQuality.BEST);
return new Bitmap(bmpd_draw);
}
另外,滾動後我清理不相鄰的新的當前頁面的那些:
function clear(targetArray:Array):void{
for(var i:int = 0; i<targetArray.length; i++){
targetArray[i].bitmapData.dispose();
targetArray[i].bitmapData = null;
targetArray[i].parent.removeChild(targetArray[i]);
targetArray[i] = null;
}
if(targetArrays[targetArrays.indexOf(targetArray)] = new Array();
}
多久一次: 水平滾動後,我添加一個新的水平頁面和一個新的垂直頁面,並刪除一個水平頁面和至少一個垂直頁面。 垂直滾動後,我只添加一個新的垂直頁面(如果下一個垂直頁面是我已經沒有添加的頁面),所以垂直頁面我保持在舞臺上,直到下一個水平滾動發生。這需要較小的延遲,但也值得注意。
我知道Flash/AIR不是最好的方式,但現在我擁有了。我怎樣才能擺脫addChild-delay?是的,你不能,所以更好的方法來做這一切? 我很確定我在這裏用了一些很難的方法,但只是無法弄清楚我應該怎麼做。
實際所用時間在哪裏?在你的BitmapScaled函數或實際的addChild函數中? – SushiHangover
不要在移動設備上繪製位圖數據,此操作對於大型位圖而言太慢,1秒或更長,具體取決於設備。您的資產必須在需要之前準備好顯示。 – BotMaster
@BotMaster謝謝,這當然解釋了原因。我是否應該像現在一樣將它們變成Mc's和addChild/removeChild,還是僅僅調整它們的「可見」屬性就足夠了,而所有這些屬性都已經添加到舞臺上了?或者我應該嘗試更好的方法?任何好的,如果我畫的開始,只是addChild/removeChild最終的位圖? – kaarto