Вот такой подход. Это очень просто. Он использует последовательное приближение к нулю в fontsize и, как правило, может вычислять его менее чем за 10 итераций. Просто замените «activityWidth» на ширину любого вида, который вы используете для отображения текста. В моем примере он задан как личное поле ширины экрана. Исходный шрифт 198 устанавливается только в том случае, если метод генерирует исключение (чего на самом деле никогда не должно быть):
private float GetFontSizeForScreenWidth(String text)
{
float fontsize = 198;
try
{
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
Typeface typeface = Typeface.create("Helvetica", Typeface.BOLD);
paint.setTypeface(typeface);
paint.setTextAlign(Align.CENTER);
int lowVal = 0;
int highVal = 2000;
int currentVal = highVal;
/*
* Successively approximate the screen size until it is
* within 2 pixels of the maximum screen width. Generally
* this will get you to the closest font size within about 10
* iterations.
*/
do
{
paint.setTextSize(currentVal);
float textWidth = paint.measureText(text);
float diff = activityWidth - textWidth;
if ((diff >= 0) && (diff <= 2))
{
fontsize = paint.getTextSize();
return fontsize;
}
if (textWidth > activityWidth)
highVal = currentVal;
else if (textWidth < activityWidth)
lowVal = currentVal;
else
{
fontsize = paint.getTextSize();
return fontsize;
}
currentVal = (highVal - lowVal) / 2 + lowVal;
} while (true);
}
catch (Exception ex)
{
return fontsize;
}
}