2014-05-20 40 views
0

因此,我正在爲Haxe和OpenFL手機制作這個應用程序。 我有一個非常長的文本,我從一個文本文件加載,並將其放入非常高的TextField。不過,由於性能問題,我想將其轉換爲BitmapHaxe,OpenFL:在循環中在位圖上繪製TextField

但是,從文本字段中繪製的非常高的Bitmap只顯示空白(可能數據太多?),所以我決定將位圖數據分割爲「頁面」位圖,用戶可以在屏幕上滑動。

當我添加第一個「頁面」來顯示,它會。但其餘的「頁面」僅顯示爲空白圖像。 這裏是我的代碼:

images = new Array(); 

var contentHeight:Float = 560; 

field = new TextField(); 
var fieldFont = Assets.getFont("fonts/Kreon-Regular.ttf"); 
var format:TextFormat = new TextFormat(fieldFont.fontName, 26 /*currentZoom*/, 0xffffff);// 0x4F4F4F); 

format.align = TextFormatAlign.LEFT; 
field.defaultTextFormat = format; 

var fieldWidth:Float = 410; 

field.embedFonts = true; 
field.text = fullText; 
field.selectable = false; 
field.wordWrap = true; 
field.border = false; 
field.autoSize = TextFieldAutoSize.LEFT; 
field.width = fieldWidth; 
//field.x = 0; 
//addChild(field); 

//loop through lines, if line within reach, increase clip height, else make new bd 
var clipY:Float = 0; 
var clipHeight:Float = 0; 
trace(field.numLines); 
var h_:Float = field.getLineMetrics(0).height; 
var bd:BitmapData; 
var mainBd:BitmapData = new BitmapData(Std.int(field.width), Std.int(field.height), true, 0x00000000); 
mainBd.draw(field); 

for (i in 0... field.numLines) 
{ 
    try { 
     h_ = field.getLineMetrics(i).height+0.2; 
    } catch (e:Dynamic) {} 

    if (clipHeight < contentHeight + h_)//line can be accomodated 
    { 
     clipHeight += h_; 
    } 
    else { //can't be accomodated, do clipping 
     bd = new BitmapData(Std.int(field.width), Std.int(clipHeight + 5), true, 0x00000000); 
     trace("clip: clipY:" + clipY + " height:" + clipHeight); 

     bd.copyPixels(mainBd, new Rectangle(0, clipY, field.width, clipHeight), new Point(0, clipY)); 
     //bd.draw(field, new Matrix(), new ColorTransform(), BlendMode.NORMAL, new Rectangle(0, clipY, field.width, clipHeight), true); 

     images.push(new Bitmap(bd, PixelSnapping.AUTO, true)); 
     clipY += clipHeight; 
     clipHeight = 0; 
    } 
} 
addChild(images[1]); 

回答

0

您只需添加一個圖像(addChild(images[1]);)查看。

另外,我建議,您可以:

  1. 以顯示它作爲一個單一的文本字段找到確切的問題,有必要爲它打破文字的確切數額開始。
  2. 檢查文本中是否存在一些奇怪的Unicode字符,例如它們可能只是簡單地中斷渲染器佈局(應該將其視爲渲染器中的錯誤,但仍然需要將其刪除)。
  3. 如果您無法解決該問題,請使用多個文本框而不是位圖,因爲對於大型文本,您有很大可能超出內存限制(當前您的文本的一頁需要大約1Mb的內存,這是一個LOT
  4. 你現在這樣做的方式在任何情況下都不起作用,因爲你通常做同樣的渲染器。如果你想渲染它到部分位圖(並且渲染大文本有一個真正的問題),你需要劃分的部分文本並單獨呈現每個部分(基本相同,使用多個文本框用的cacheAsBitmap)

注意:位圖不應實際比任何TextField的更快,除非你使用一個很花哨字體或很多過濾器。在任何情況下,cacheAsBitmap屬性都應該自動執行所需的操作,而無需編寫所有此代碼。但我99%肯定這不是這種情況,你不需要那樣。