標籤:
摘要 canvas.drawText(www.jcodecraeer.com, x, y, paint); x和y參數是指定字串中心的座標嗎?還是左上方的座標?這個問題的直觀印象應該是左上方的座標,但是安卓的處理有點另類,我都懷疑安卓的設計者是不是腦殼有問題了。 x預設是‘www.jcodecraeer.com’這
canvas.drawText("www.jcodecraeer.com", x, y, paint); x和y參數是指定字串中心的座標嗎?還是左上方的座標?這個問題的直觀印象應該是左上方的座標,但是安卓的處理有點另類,我都懷疑安卓的設計者是不是 腦殼有問題了。
x預設是‘www.jcodecraeer.com’這個字串的左邊在螢幕的位置,如果設定了paint.setTextAlign(Paint.Align.CENTER);那就是字元的中心,y是指定這個字元baseline在螢幕上的位置。
API的解釋:public void drawText (String text, float x, float y, Paint paint)Since: API Level 1 Draw the text, with origin at (x,y), using the specified paint.The origin is interpreted based on the Align setting in the paint.起始點的具體位置決定於paint的align設定。Parameterstext The text to be drawnx The x-coordinate of the origin of the text being drawn y The y-coordinate of the origin of the text being drawn paint The paint used for the text (e.g. color, size, style)
Canvas 作為繪製文本時,使用FontMetrics對象,計算位置的座標。 它的思路和java.awt.FontMetrics的基本相同。
FontMetrics對象它以四個基本座標為基準,分別為:FontMetrics.top
FontMetrics.ascent
FontMetrics.descent
FontMetrics.bottom
Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize( 35); textPaint.setColor( Color.WHITE); // FontMetrics對象 FontMetrics fontMetrics = textPaint.getFontMetrics(); String text = "abcdefghijklmnopqrstu"; // 計算每一個座標 float baseX = 0; float baseY = 100; float topY = baseY + fontMetrics.top; float ascentY = baseY + fontMetrics.ascent; float descentY = baseY + fontMetrics.descent; float bottomY = baseY + fontMetrics.bottom; // 繪製文本 canvas.drawText( text, baseX, baseY, textPaint); // BaseLine描畫 Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);> baseLinePaint.setColor( Color.RED); canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint); // Base描畫 canvas.drawCircle( baseX, baseY, 5, baseLinePaint); // TopLine描畫 Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); topLinePaint.setColor( Color.LTGRAY); canvas.drawLine(0, topY, getWidth(), topY, topLinePaint); // AscentLine描畫 Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); ascentLinePaint.setColor( Color.GREEN); canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint); // DescentLine描畫 Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); descentLinePaint.setColor( Color.YELLOW); canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint); // ButtomLine描畫 Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); bottomLinePaint.setColor( Color.MAGENTA); canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);
drawText畫字串是baseline對齊的。所以要特別注意這點,不然畫文字可能畫到其它地方而誤以為沒有畫出來。
如果baseline對齊的話:底端的Y座標是:(行高-字型高度)/2+字型高度 ,但是字串並不置中,經過測試如果:(行高-字型高度)/2+字型高度-6 ,就稍微置中了一點。 以上的方法只是一個取巧的做法,網上也沒有找到設定文字置中的方法。
按上面辦法會有誤差。加上那段距離應該就行了:
FontMetrics fontMetrics = mPaint.getFontMetrics();
float fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
float offY = fontTotalHeight / 2 - fontMetrics.bottom;
float newY = baseY + offY;
canvas.drawText(text, baseX, newY, paint);
Android Canvas.drawText方法中的座標參數的正確解釋