2011-06-03 62 views
17

因此,我使用Paint的measureText()方法來測量一段文本的寬度,但我想根據某個文本大小來測量文本。假設我想獲得一個文本段的寬度,當它佔據某個TextView時,這個段的寬度將爲20個縮放像素。我試過以下內容:Android:measureText()基於比例像素的返回像素

Paint paint = new Paint(); 
paint.setTextSize(20); 
paint.measureText("sample text"); 

但是,它似乎並沒有工作。我相信它正在返回一個較小的文字大小的寬度。我感覺自己失去了一些能讓我拍拍自己的東西,並大聲嚷嚷着her de。

回答

38

你需要得到densityMultiplier像這樣:

final float densityMultiplier = getContext().getResources().getDisplayMetrics().density; 
final float scaledPx = 20 * densityMultiplier; 
paint.setTextSize(scaledPx); 
final float size = paint.measureText("sample text"); 
+0

非常感謝!我的印象是setTextSize的參數已經是縮放像素了,所以我對我出錯的地方感到困惑。現在工作正常。 :-) – Vinay 2011-06-03 22:55:40

+0

不適用於我,我將textview設置爲20sp並運行此代碼,尺寸給我的東西比預期的要小 – schwiz 2011-10-04 03:48:01

+0

檢查字體大小首選項:sp 與比例無關的像素 - 這與dp單元類似,但它也會根據用戶的字體大小偏好進行縮放。建議您在指定字體大小時使用本機,以便針對屏幕密度和用戶偏好進行調整。 – 2011-10-04 04:08:21

1

當我必須的時候,我會這樣做。

int textSize = 20; 
for(int i = 2; i<18 && curTextSize< textSize;i+=2) 
{ 
    this.label.setTextSize(i); 
    curTextSize = this.label.getPaint().measureText(this.label.getText().toString()); 
} 
-1

嘗試

Paint.SetLinearText(true) 

這解決了這個問題對我來說。

0

我沒有足夠的聲望點數上的答案,但在參考上公認的答案的評論通過@schwiz和@AndreasEK評論:

measureText(),與getTextBounds()一起,不包括填充因此它可能該解決他們的問題是增加的左右填充(或開始和結束填充)

final float scaleFactor = getContext().getResources().getDisplayMetrics().density; 
final float scaledPx = 20 * scaleFactor; 
paint.setTextSize(scaledPx); 
final float padding = scaleFactor * (textView.getPaddingStart() + textView.getPaddingEnd()); 
final float size = paint.measureText("sample text") + padding;