2016-09-07 73 views
2

我已經做了幾個測試來定位文本在畫布上給定的位置,並得出結論,drawText()不能正常工作。 (我的示例代碼和屏幕截圖將顯示。)如果可能,請給我一個建議如何解決這個問題。如何讓drawText()精確定位?

如果有任何文字(在我的例子中只是「123」),我可以正確地獲得文本的大小。但是,定位(主要是水平)不準確。更糟糕的是,這種現象與所有人物並不相同。例如。如果文本以「A」開始,則按預期工作。

我從截圖中附加了兩個區域。具有「123」的那個顯示文本如何向右偏移。具有「A12」的那個顯示了定位正確時的外觀。我的代碼繪製了一個灰色的控制矩形,並給出了文本的尺寸。人們應該期望文本恰好出現在這個框架中。但事實並非如此。有這個問題,不可能準確地設置圖紙中的任何文字。

package com.pm.pmcentertest; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.view.View; 

public class Draw extends View { 

public Paint myPaint; 

public Draw(Context context) { 
    super(context); 
    myPaint = new Paint(); 
} 

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawColor(Color.CYAN); 

    // The text shall appear in the lower left corner 
    int x = 0; 
    int y = canvas.getHeight(); 

    // We use a large text size for demonstration 
    String Text = "123"; 
    myPaint.setTextSize(400); 

    // We get the dimensions of the text 
    Rect bounds = new Rect(); 
    myPaint.getTextBounds(Text, 0, Text.length(), bounds); 

    // Now we draw a rectangle for the area in which the text should appear 
    // using the TextBounds values 
    myPaint.setColor(Color.parseColor("GREY")); 
    canvas.drawRect(x, y - bounds.height(), x + bounds.width(), y, myPaint); 

    // Now we draw the text to the same position 
    myPaint.setColor(Color.parseColor("WHITE")); 
    canvas.drawText(Text, x, y, myPaint); 

    } 
} 

Negative example with offset

Positive example when start with A

+0

你想達到什麼目的? –

回答

0

的問題是在Rect對象。你必須改變你的代碼:

canvas.drawRect(x, y - bounds.height(), x + bounds.width(), y, myPaint); 

bounds.width() - > bounds.right

canvas.drawRect(x, y - bounds.height(), x + bounds.right, y, myPaint); 

方法width()返回矩形的寬度。這不檢查有效的矩形(即,左邊< =右邊),因此結果可能是負值。

+0

尊敬的Volodymyr,bounds.width()實際上代表了文本的真實長度。不過,多虧了你的回答,我意識到界限矩陣常常不以0作爲其最左點。 (這很奇怪,我不明白它的意義。)但是,我現在發現的是,bounds.left值代表了我所遭受的顯示偏移量。所以解決這個問題的方法是將文本定位行改爲:canvas.drawText(Text,x - bounds.left,y - bounds.bottom,myPaint);謝謝你給我這個有價值的提示。彼得 –

+0

@PeterMattheisen是的,我同意你的觀點並不那麼明顯。 –