Боюсь, что все методы, доступные в TextField, должны делать то, что вы уже нашли. Если производительность не является ключевой в вашем приложении (т. Е. Если вы не собираетесь делать это очень часто), возможно, одним из вариантов будет рисование текстового поля в BitmapData и поиск самых верхних, самых левых и т. Д. Цветных пикселей в ограничительной рамке, полученной getCharBoundaries ()
var i : int;
var rect : Rectangle;
var top_left : Point;
var btm_right : Point;
var bmp : BitmapData = new BitmapData(tf.width, tf.height, false, 0xffffff);
bmp.draw(tf);
rect = tf.getCharBoundaries(4);
top_left = new Point(Infinity, Infinity);
btm_right = new Point(-Infinity, -Infinity);
for (i=rect.x; i<rect.right; i++) {
var j : int;
for (j=rect.y; j<rect.bottom; j++) {
var px : uint = bmp.getPixel(i, j);
// Check if pixel is black, i.e. belongs to glyph, and if so, whether it
// extends the previous bounds
if (px == 0) {
top_left.x = Math.min(top_left.x, i);
top_left.y = Math.min(top_left.y, j);
btm_right.x = Math.max(btm_right.x, i);
btm_right.y = Math.max(btm_right.y, j);
}
}
}
var actualRect : Rectangle = new Rectangle(top_left.x, top_left.y);
actualRect.width = btm_right.x - top_left.x;
actualRect.height = btm_right.y - top_left.y;
Этот код должен пройти через все пиксели, которые считались частью прямоугольника глифа методом getCharBoundaries (). Если пиксель не черный, он отбрасывается. Если он черный, код проверяет, расширяются ли пиксели вверх, вниз, вправо или влево по сравнению с любым пикселем, который ранее был проверен в цикле.
Очевидно, что это не оптимальный код, с вложенными циклами и ненужными точечными объектами. Надеюсь, что код достаточно читабелен, и вы сможете разобрать части, которые легче всего оптимизировать.
Возможно, вы захотите ввести некоторое пороговое значение вместо игнорирования любого пикселя, который не является черным.