2012-02-20 58 views
8

我目前正致力於渲染位圖,然後再發送到移動打印機。然而,我正在努力測量我的文本的高度,所以我可以適當地提高y的位置。安卓:在畫布上測量文字高度

我的基本的位圖/月/漆的配置是這樣的(字體大小爲16和位圖的尺寸是200x400(寬x高):

public MyRenderer() { 
    // Initialize bitmap 
    bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888); 

    // Initialize canvas 
    canvas = new Canvas(bitmap); 

    // Initialize brush (Paint instance) 
    brush = new Paint(); 
    brush.setTextSize(16); 
    brush.setTypeface(Typeface.SANS_SERIF); 
    brush.setColor(Color.BLACK); 
    brush.setStyle(Paint.Style.FILL); 
    brush.setAntiAlias(true); 
    brush.setTextAlign(Align.LEFT); 
} 

到目前爲止好,現在我想do是:如果我使用Paint的方法drawText,我需要提供x和y座標,至於x是零(假設左對齊文本),但是對於y,我必須計算每個文本的高度,加上它,所以我可以跟蹤我當前的y位置

而這就是奇怪的地方:我使用以下方法來確定文本的高度(使用Pai NT反對說,我以前初始化 - 這就是所謂的「刷」):

public int measureHeight(String text) { 
    Rect result = new Rect(); 
    // Measure the text rectangle to get the height 
    brush.getTextBounds(text, 0, text.length(), result); 
    return result.height(); 
} 

上述方法下列文本返回下列值:

  1. 的Hello World」返回高度12
  2. 攝像機實例可用於計算3D變換並生成矩陣。「返回高度
  3. Android設計簡介:瞭解創建世界級Android用戶界面的原理,構建模塊和模式的地方。無論您是UI專業人員還是擔任此職位的開發人員,這些文檔都會告訴您如何做出大大小小的優秀設計決策。「返回

是有意義的我的高度,即2號和3返回比數1,但具有更大的高度,如果一個線具有12的高度(如頭號一樣) - 它沒有任何意義,多行有16的高度?

我在這裏丟失了什麼嗎?有一個方便的方法來測量文本的寬度(使用paint和調用measureText(「myText」)的實例完美的作品,但是我相當茫然,談到高度,因爲上面給出的結果對我來說沒有任何意義。

編輯

我知道,那getTextBounds大概會多行文本沒有自動換行,這是很正常的,我已經寫了拆分文本的方法,但即使它只是衡量一個線,上述給定的長度值似乎不太可能。

回答

16

我認爲這是因爲「compute」中的「p」延伸到基線以下,而「Hello World」只包含高於基線的字母。

由於行距不應取決於您的文字碰巧包含哪些特定字母,您可能正在尋找可通過Paint.getFontMetrics()獲取的Paint.FontMetrics。計算descent - ascent + leading以獲得推薦的基線距離(因爲上升具有負值)。

+0

我計算的基線距離(按你的計算),對於給定的文本上面那三個,它總是返回19將這意味着,如果我拿19的高度,那麼下一行仍然有足夠的空間不與當前行重疊?非常感謝您提前! – AgentKnopf 2012-02-21 06:40:48

+0

這是字體的一個特點,您不必爲不同的文本重複計算。無論文本包含哪些字符,您都希望距離始終相同。是的,這些線不會重疊。 – devconsole 2012-02-21 09:17:00

+0

非常感謝你 - 這就是我所做的和呈現我的位圖現在工作得很好:)。我在MyRenderer的構造函數中初始化「行高」。 – AgentKnopf 2012-02-21 09:59:52

4

有在接受答案的一個小錯誤。如果你想文本高度,你應該使用

Paint.FontMetrics fm = mTextPaint.getFontMetrics(); 
float textHeight = fm.descent - fm.ascent; 

如果你想在高度,你應該使用

float lineHeight = fm.bottom - fm.top + fm.leading; 

領導是可選的行間距,因此,如果您需要得到高線你可以包括它。但是,如果你只是想要文字高度,那麼你可以離開它。

注意

  • 我從來沒有真正看到leading是別的比0,而據我可以告訴它甚至似乎在TextView source code被忽略(及其相關LayoutStaticLayout,等等。)。如果我錯了,請糾正我。所以它可能是安全的,它使它不符合高線計算,但我不完全確定這一點。

又見