2012-09-13 19 views

回答

6

正如Astraport提到的,每次使用bitmapData.draw()更新文本時,都需要將文本字段繪製爲位圖數據。

如果使用textField.getBounds確定的位圖數據的你需要的大小,所產生的邊界矩形將不包括因過濾多餘的大小(例如一個的DropShadowFilter伸出通過依賴於某些像素的文本框的側面「距離「和」模糊「)。爲了確保在繪製位圖時包含過濾器,還需要使用bitmapData.generateFilterRect()以獲取正確的大小rect。

代碼段(未經測試,但總的想法):

// Remember the transform matrix of the text field 
var offset : Matrix = myTextField.transform.matrix.clone(); 
// Get the bounds of just the textfield (does not include filters) 
var tfBounds : Rectangle = myTextField.getBounds(myTextField.parent);  
// Create a bitmapData that is used just to calculate the size of the filters 
var tempBD : BitmpaData = new BitmapData(Math.ceil(tfBounds.width), Math.ceil(tfBounds.height)); 
// Make a copy of the textField bounds. We'll adjust this with the filters 
var finalBounds : rectangle = tfBounds.clone(); 
// Step through each filter in the textField and adjust our bounds to include them all 
var filterBounds : rectangle; 
for each (var filter : BitmapFilter in myTextField.filters) { 
    filterBounds = tempBD.generateFilterRect(tfBounds, filter); 
    finalBounds.left = Math.min(finalBounds.left, filterBounds.left); 
    finalBounds.right = Math.max(finalBounds.right, filterBounds.right); 
    finalBounds.top = Math.min(finalBounds.top, filterBounds.top); 
    finalBounds.bottom = Math.max(finalBounds.bottom, filterBounds.bottom); 
} 

// Now draw the textfield to a new bitmpaData 
var textFieldBD : BitmpaData = new BitmapData(Math.ceil(finalBounds.width), math.ceil(finalBounds.height)); 
offset.tx = -finalBounds.x; 
offset.ty = -finalBounds.y; 
textFieldBD.draw(myTextField.parent, offset, myTextField.transform.colorTransform); 

// Create a bitmap and add the bitmap data. Note: normally you would create a 
// bitmap once and just update the bitmpaData 
var bitmap : Bitmap = new Bitmap(); 
myTextField.parent.addChild(bitmap); 

// Position the bitmap in same place as textField 
bitmap.bitmapData = textFieldBD; 
bitmap.x = myTextField.x - finalBounds.x; 
bitmap.y = myTextField.y - finalBounds.y; 
myTextField.visible = false; 
0

其基本思想是按照正常方式應用濾鏡,然後將顯示對象繪製爲位圖數據並將位圖添加到舞臺上。一個例子見http://forums.adobe.com/message/3934192

如果要應用此文本是靜態的,應該很容易做到,但是如果您想要應用此動態文本(例如,頻繁更改的分數計數器或用戶定義的文本)可編輯)我想可能會開始討厭,但我不知道任何其他解決方案。

+0

我看到了這個建議,但它不適合我。我正在使用動態文本。 – Astraport

2

這裏是如何轉換成任何DisplayObjectBitmap - 有用的 「恢復」,在AIR GPU濾鏡效果的移動rendermode。這是Pixelthis的溶液,固定,優化和測試:

// => 'bitmap' must belong to the same parent as 'obj'. 'obj' should be invisible. 
    static public function Update(obj:DisplayObject, bitmap:Bitmap):void { 
     //trace("CacheToBmp",obj.name); 

     // Remember the transform matrix of the text field 
     var offset:Matrix = obj.transform.matrix.clone(); 
     // Get the bounds of just the textfield (does not include filters) 
     var bounds:Rectangle = obj.getBounds(obj); 
     // Create a bitmapData that is used just to calculate the size of the filters 
     var tempBD:BitmapData = new BitmapData(Math.ceil(bounds.width), Math.ceil(bounds.height), false); 
     bounds.width = obj.width; 
     bounds.height = obj.height; 
     // Make a copy of the textField bounds. We'll adjust this with the filters 
     var finalBounds:Rectangle = new Rectangle(0,0,bounds.width,bounds.height); 

     // Step through each filter in the textField and adjust our bounds to include them all 
     var filterBounds:Rectangle; 
     for each (var filter:BitmapFilter in obj.filters) { 
      filterBounds = tempBD.generateFilterRect(tempBD.rect, filter); 
      finalBounds = finalBounds.union(filterBounds); 
     } 
     finalBounds.offset(bounds.x,bounds.y); 
     finalBounds.x = Math.floor(finalBounds.x); 
     finalBounds.y = Math.floor(finalBounds.y); 
     finalBounds.width = Math.ceil(finalBounds.width); 
     finalBounds.height = Math.ceil(finalBounds.height); 

     // Now draw the textfield to a new bitmpaData 
     var data:BitmapData = new BitmapData(finalBounds.width, finalBounds.height, false, 0); 
     offset.tx = -finalBounds.x; 
     offset.ty = -finalBounds.y; 
     data.drawWithQuality(obj, offset, obj.transform.colorTransform, obj.blendMode, null, true, StageQuality.HIGH); 
     bitmap.bitmapData = data; 

     // Position the bitmap in same place as 'obj' 
     bitmap.x = obj.transform.matrix.tx + finalBounds.x; 
     bitmap.y = obj.transform.matrix.ty + finalBounds.y; 
    }