Я недавно написал приведенный ниже код, так как мне нужно было измерять высоту пикселя для определенных диапазонов шрифта (например, для всех нижних символов или для всех чисел).
Если вам нужен более быстрый код (у меня есть для циклов), я бы порекомендовал запустить его один раз при запуске, чтобы получить все значения (например, от 1 до 100) в массиве, а затем использовать вместо этого массив.
Код в основном рисует все символы из входной строки в одном и том же месте, наложенном на битовый массив 250x250 (при необходимости увеличивается или уменьшается), он начинает искать пиксели сверху, затем снизу, а затем возвращает максимальную найденную высоту. Он работает с обычными строками, даже если он был разработан для диапазонов символов. Это означает, что при оценке обычных строк возникает некоторая избыточность, поскольку некоторые символы повторяются. Поэтому, если ваша строка ввода превышает число алфавитов (26), используйте в качестве «tRange» imput: «abcd ... z» и другие символы, которые могут использоваться. Это быстрее.
Надеюсь, это поможет.
public int getFontPixelHeight(float inSize, Paint sourcePaint, String tRange)
{
// It is assumed that the font is already set in the sourcePaint
int bW = 250, bH = 250; // bitmap's width and height
int firstContact = -1, lastContact = -2; // Used when scanning the pixel rows. Initial values are set so that if no pixels found, the returned result is zero.
int tX = (int)(bW - inSize)/2, tY = (int)(bH - inSize)/2; // Used for a rough centering of the displayed characters
int tSum = 0;
// Preserve the original paint attributes
float oldSize = sourcePaint.getTextSize();
int oldColor = sourcePaint.getColor();
// Set the size/color
sourcePaint.setTextSize(inSize); sourcePaint.setColor(Color.WHITE);
// Create the temporary bitmap/canvas
Bitmap.Config bConf = Bitmap.Config.ARGB_8888;
Bitmap hld = Bitmap.createBitmap(250, 250, bConf);
Canvas canv = new Canvas(hld);
for (int i = 0; i < bH; i++)
{
for (int j = 0; j < bW; j++)
{
hld.setPixel(j, i, 0); // Zero all pixel values. This might seem redundant, but I am not quite sure that creating a blank bitmap means the pixel color value is indeed zero, and I need them to be zero so the addition performed below is correct.
}
}
// Display all characters overlapping at the same position
for (int i = 0; i < tRange.length(); i++)
{
canv.drawText("" + tRange.charAt(i), tX, tY, sourcePaint);
}
for (int i = 0; i < bH; i++)
{
for (int j = 0; j < bW; j++)
{
tSum = tSum + hld.getPixel(j, i);
}
if (tSum > 0) // If we found at least a pixel, save row index and exit loop
{
firstContact = i;
tSum = 0; // Reset
break;
}
}
for (int i = bH - 1; i > 0 ; i--)
{
for (int j = 0; j < bW; j++)
{
tSum = tSum + hld.getPixel(j, i);
}
if (tSum > 0) // If we found at least a pixel, save row index and exit loop
{
lastContact = i;
break;
}
}
// Restore the initial attributes, just in case the paint was passed byRef somehow
sourcePaint.setTextSize(oldSize);
sourcePaint.setColor(oldColor);
return lastContact - firstContact + 1;
}