關於Android Canvas.drawText方法中的座標參數的正確解釋

來源:互聯網
上載者:User

標籤:

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設定。
Parameters
text The text to be drawn
x 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 ,就稍微置中了一點。 以上的方法只是一個取巧的做法,網上也沒有找到設定文字置中的方法。

按上面辦法會有誤差。加上那段距離應該就行了:

12345 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方法中的座標參數的正確解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.