そこで、PaintのmeasureText()メソッドを使用してテキストのセグメントの幅を測定しましたが、特定のテキストサイズに基づいてテキストを測定したかったのです。特定のTextViewを占有するときに20スケーリングされたピクセルになるテキストセグメントの幅を取得したいとします。私は以下を試しました:
Paint paint = new Paint();
Paint.setTextSize(20);
Paint.measureText("sample text");
ただし、機能していないようです。小さいテキストサイズに対して幅を返していると思います。顔を平手打ちして、ヘルプダープを叫ぶような何かが足りないような気がします。
次のようにdensityMultiplierを取得する必要があります。
final float densityMultiplier = getContext().getResources().getDisplayMetrics().density;
final float scaledPx = 20 * densityMultiplier;
Paint.setTextSize(scaledPx);
final float size = Paint.measureText("sample text");
私はしなければならないときにこのようなことをします。
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());
}
回答にコメントするのに十分な評判ポイントがありませんが、受け入れられた回答に対する@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;