我正在寻找一种最佳方法来调整包装文本的大小TextView,使其适合其getHeight和getWidth界限.我不是简单地寻找一种包装文本的方法 - 我想确保它既包装又小到足以完全适合屏幕.
我在StackOverflow上看到了一些需要自动调整大小的情况,但它们或者是非常特殊的黑客解决方案案例,没有解决方案,或者涉及TextView递归重新绘制,直到它足够小(这是内存密集并迫使用户观看文本逐步收缩每次递归).
但是我确信那里有人找到了一个很好的解决方案,不涉及我正在做的事情:编写几个重度例程来解析和测量文本,调整文本大小,然后重复直到找到一个合适的小尺寸.
TextView用于包装文本的例程是什么?难道不能以某种方式用来预测文本是否足够小?
tl; dr:是否有一种最佳实践方法可以自动调整大小TextView以适应,包裹,在其getHeight和getWidth范围内?
我正在测量文本Paint.getTextBounds(),因为我有兴趣获得要渲染的文本的高度和宽度.但是,实际呈现的文本总是比填充.width()的Rect信息宽一些getTextBounds().
令我惊讶的是,我进行了测试.measureText(),发现它返回了一个不同的(更高)值.我试一试,发现它是正确的.
为什么他们报告不同的宽度?我怎样才能正确获得高度和宽度?我的意思是,我可以使用.measureText(),但后来我不知道我是否应该相信.height()返回者getTextBounds().
根据要求,这里是重现问题的最小代码:
final String someText = "Hello. I believe I'm some text!";
Paint p = new Paint();
Rect bounds = new Rect();
for (float f = 10; f < 40; f += 1f) {
p.setTextSize(f);
p.getTextBounds(someText, 0, someText.length(), bounds);
Log.d("Test", String.format(
"Size %f, measureText %f, getTextBounds %d",
f,
p.measureText(someText),
bounds.width())
);
}
Run Code Online (Sandbox Code Playgroud)
输出显示的差异不仅得到大于1(且没有最后一分钟的舍入误差),也似乎增加与大小(我正要吸引更多的结论,但它可能是完全的字体相关的):
D/Test ( 607): Size 10.000000, measureText 135.000000, …Run Code Online (Sandbox Code Playgroud) 这似乎是一个基本问题,但我在SO上找不到类似的问题.在阅读文档时,我无法理解这些概念.我想了解有什么区别之间top和ascent,也bottom和descent.基准到底在哪里?你有图表来帮我形象化吗?
我需要构建自己的自定义,TextView所以我一直在学习StaticLayout在画布上绘制文本.这比Canvas.drawText()直接使用更好,或者说文档说的.但是,文档没有给出任何示例.只有模糊的参考才能StaticLayout.Builder成为更新的方法.
我终于工作了,但是我在下面添加了我的解释.
我目前正致力于渲染Bitmap,然后我想将其发送到移动打印机.但是,我正在努力测量文本的高度,所以我可以适当地提升y位置.
我的基本位图/画布/绘画配置是这样的(字体大小是16,位图的尺寸是200x400(宽x高)):
public MyRenderer() {
// Initialize bitmap
bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888);
// Initialize canvas
canvas = new Canvas(bitmap);
// Initialize brush (Paint instance)
brush = new Paint();
brush.setTextSize(16);
brush.setTypeface(Typeface.SANS_SERIF);
brush.setColor(Color.BLACK);
brush.setStyle(Paint.Style.FILL);
brush.setAntiAlias(true);
brush.setTextAlign(Align.LEFT);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,现在我想做的是:如果我使用Paint的方法drawText,我需要提供x和y坐标.至于x为零(假设左对齐文本)但是对于y,我必须计算我打印的每个文本的高度并将其加起来,这样我就可以跟踪我当前的y位置.
这是奇怪的地方:我使用以下方法来确定文本的高度(使用我先前初始化的Paint对象 - 它被称为"brush"):
public int measureHeight(String text) {
Rect result = new Rect();
// Measure the text rectangle to get the height
brush.getTextBounds(text, 0, text.length(), result);
return result.height();
}
Run Code Online (Sandbox Code Playgroud)
上述方法为以下文本返回以下值:
我有一个Hello现在称为文本的文本我需要在文本大小增加的文本中应用字体后立即对此说12或18应用fontsize.
所以现在我需要使用paint获取文本高度,包括字体大小.
我尝试过以下涂料:
String finalVal ="Hello";
Paint paint = new Paint();
paint.setTextSize(18);
paint.setTypeface(Typeface.SANS_SERIF);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
Rect result = new Rect();
// Measure the text rectangle to get the height
paint.getTextBounds(finalVal, 0, finalVal.length(), result);
Run Code Online (Sandbox Code Playgroud)
但它不起作用,请帮忙
编辑
我试图根据textheight动态设置webview的高度我得到单行的文本高度,"Hello"但如果文本中有两行"My name is abc and my dads name is xyz and my moms name is 123" now its not getting the proper text height".
我正在android中编写一个文本,现在需要两行以上,我的问题是如何缩进我的文本行的第二行.
1.my name is qadeer hussain
iam fine how Ru.
Run Code Online (Sandbox Code Playgroud)
但我想要
1.my name is qadeer hussain
iam fine how Ru.
Run Code Online (Sandbox Code Playgroud)
这里第二行不是从一行开始,而是在名称正下方
如何绘制带有指定边界的填充矩形,并使用Canvas Android绘制该矩形文本?我试过了
mPaint.setColor(Color.GREEN);
canvas.drawText(mText, x, y, mPaint);
mPaint.setColor(Color.BLACK);
canvas.drawRect(x, y, x + w, y + h, mPaint);
Run Code Online (Sandbox Code Playgroud)
但文字不在那个矩形内.任何好友都可以告诉我如何在考虑文本大小的情况下绘制一个围绕指定文本的矩形吗?
开发.docs没有说明该单位.像素,dps,cm? http://developer.android.com/reference/android/graphics/Paint.html#setTextSize(float)
从实验来看,最可能的答案是像素,但我不确定.