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

來源:互聯網
上載者:User

標籤:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.