我想canvas
使用一定宽度绘制文本.drawtext
例如,400px
无论输入文本是什么,文本的宽度都应始终不变。
如果输入文本较长,则会减小字体大小,如果输入文本较短,则会相应增加字体大小。
我想canvas
使用一定宽度绘制文本.drawtext
例如,400px
无论输入文本是什么,文本的宽度都应始终不变。
如果输入文本较长,则会减小字体大小,如果输入文本较短,则会相应增加字体大小。
这是一个更有效的方法:
/**
* Sets the text size for a Paint object so a given string of text will be a
* given width.
*
* @param paint
* the Paint to set the text size for
* @param desiredWidth
* the desired width
* @param text
* the text that should be that width
*/
private static void setTextSizeForWidth(Paint paint, float desiredWidth,
String text) {
// Pick a reasonably large value for the test. Larger values produce
// more accurate results, but may cause problems with hardware
// acceleration. But there are workarounds for that, too; refer to
// http://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache
final float testTextSize = 48f;
// Get the bounds of the text, using our testTextSize.
paint.setTextSize(testTextSize);
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
// Calculate the desired size as a proportion of our testTextSize.
float desiredTextSize = testTextSize * desiredWidth / bounds.width();
// Set the paint for that size.
paint.setTextSize(desiredTextSize);
}
然后,您需要做的就是setTextSizeForWidth(paint, 400, str);
(400 是问题中的示例宽度)。
为了获得更高的效率,您可以将Rect
其设为静态类成员,从而避免每次都对其进行实例化。但是,这可能会引入并发问题,并且可能会妨碍代码的清晰度。
试试这个:
/**
* Retrieve the maximum text size to fit in a given width.
* @param str (String): Text to check for size.
* @param maxWidth (float): Maximum allowed width.
* @return (int): The desired text size.
*/
private int determineMaxTextSize(String str, float maxWidth)
{
int size = 0;
Paint paint = new Paint();
do {
paint.setTextSize(++ size);
} while(paint.measureText(str) < maxWidth);
return size;
} //End getMaxTextSize()
Michael Scheper 的解决方案 看起来不错,但对我不起作用,我需要获得可以在我的视图中绘制的最大文本大小,但这种方法取决于您设置的第一个文本大小,每次设置不同的大小时'会得到不同的结果,不能说它在每种情况下都是正确的答案。
所以我尝试了另一种方法:
private float calculateMaxTextSize(String text, Paint paint, int maxWidth, int maxHeight) {
if (text == null || paint == null) return 0;
Rect bound = new Rect();
float size = 1.0f;
float step= 1.0f;
while (true) {
paint.getTextBounds(text, 0, text.length(), bound);
if (bound.width() < maxWidth && bound.height() < maxHeight) {
size += step;
paint.setTextSize(size);
} else {
return size - step;
}
}
}
这很简单,我增加文本大小,直到文本矩形绑定尺寸足够接近maxWidth
并且maxHeight
,减少循环重复只需更改step
为更大的值(准确性与速度),也许这不是实现这一目标的最佳方法,但它有效。