我正在寻找一种最佳方法来调整包装文本的大小TextView,使其适合其getHeight和getWidth界限.我不是简单地寻找一种包装文本的方法 - 我想确保它既包装又小到足以完全适合屏幕.
我在StackOverflow上看到了一些需要自动调整大小的情况,但它们或者是非常特殊的黑客解决方案案例,没有解决方案,或者涉及TextView递归重新绘制,直到它足够小(这是内存密集并迫使用户观看文本逐步收缩每次递归).
但是我确信那里有人找到了一个很好的解决方案,不涉及我正在做的事情:编写几个重度例程来解析和测量文本,调整文本大小,然后重复直到找到一个合适的小尺寸.
TextView用于包装文本的例程是什么?难道不能以某种方式用来预测文本是否足够小?
tl; dr:是否有一种最佳实践方法可以自动调整大小TextView以适应,包裹,在其getHeight和getWidth范围内?
是否有一种方法可以根据用于绘制它的Paint使用drawText()方法返回要在Android画布上绘制的文本的宽度(以像素为单位)?
有没有直接测量文字高度的方法?我现在这样做的方法是使用Paint measureText()来获取宽度,然后通过试验和错误找到一个值来获得近似高度.我也一直在搞乱FontMetrics,但所有这些似乎都是近似的方法.
我正在尝试扩展不同分辨率的东西.我可以做到,但我最终得到了令人难以置信的冗长代码,并通过大量计算来确定相对大小.我讨厌它!一定有更好的方法.
我试图计算多行文本段落的宽度.据我所知,唯一可以在Android中执行此操作的类是StaticLayout(或DynamicLayout)类.当使用这个类时,我没有得到我的文本片段的适当长度,而是测量的尺寸有时更小,有时更大,取决于文本大小.
所以我基本上在寻找一种可靠地测量多行文本字符串宽度的方法.
下图显示了测量宽度与各种文本大小的实际文本长度的差异.
在自定义视图中运行以下代码创建屏幕截图:
@Override
protected void onDraw( Canvas canvas ) {
for( int i = 0; i < 15; i++ ) {
int startSize = 10;
int curSize = i + startSize;
paint.setTextSize( curSize );
String text = i + startSize + " - " + TEXT_SNIPPET;
layout = new StaticLayout( text,
paint,
Integer.MAX_VALUE,
Alignment.ALIGN_NORMAL,
1.0f,
0.0f,
true );
float top = STEP_DISTANCE * i;
float measuredWidth = layout.getLineMax( 0 );
canvas.drawRect( 0, top, measuredWidth, top + curSize, bgPaint …Run Code Online (Sandbox Code Playgroud) 我们曾经找到适合给定文本的矩形,例如,如果在gettextbounds api中给出"TESTING",它将给出一个适合给定字符串"TESTING"的矩形,但是任何plz都可以澄清在哪个基础上计算矩形长度,我是否可以这样检查字体大小是否可以考虑?
1)我试过CharSequence text = getText(); canvas.drawText(text,0,text.length(),mTextX,mTextY,getPaint());
Paint pt = new Paint ( );
pt.setTextSize(10);
TextPaint tp = getPaint();
String string = "haa";
Rect currentBounds = new Rect ( );
//this.setTextSize(/* TypedValue.COMPLEX_UNIT_PX */ 10, /* fontPixelSize*Home.fltFontRatio */ 32);
tp.getTextBounds((String) text, 0, text.length(), currentBounds );
Log.e ( " ", "Desired Text " +text);
Log.e ( " ", "first Ondraw Left " +currentBounds.left);
Log.e ( " ", "Ondraw Top" +currentBounds.top);
Log.e ( " ", "Ondraw right " +currentBounds.right);
Log.e ( " ", …Run Code Online (Sandbox Code Playgroud) 我看过很多关于类似问题的帖子,但没有一个对我有用.在Canvas,我有一个大小的矩形,比方说,200px到200px,我想在这个矩形中写文字.文本不需要填充整个矩形,但重要的是当到达矩形的末尾时应该自动换行.我怎样才能在Android中执行此操作?
我将在Android应用程序的几个页面上显示完整的文本文档.每个页面都包含一个TextView控件,负责显示文本.它还包含一个下一个按钮,该按钮负责更新textview并按照文本从最后显示的部分结束的位置开始.
问题是如何在TextView的可显示区域中找到最后显示的单词?
注意:在这个应用程序中,textView 不应该滚动或使用ellipsize.还必须注意,文本化可以增加或减少.要更好地了解情况:要显示的示例文本:
这是全文.在第一页它刚刚结束在这里的,必须从这里被遵循.
这是其显示的示例说明.问题是如何找到第1页中显示的最后一个单词"here"?

Paint类中有一个方法:Paint.getTextBounds()返回Rect某些文本占用的内容.但根据这个答案,它会返回与TextView的宽度/高度不同的东西.
Q1:有没有办法Rect通过Paint.getTextBounds()返回TextView的宽度和高度?
注意,我确实需要精确地知道宽度/高度.我很高兴知道rect可能的错误大约2-3%的上限,但它必须不大(并且应该适用于任何不依赖于屏幕分辨率和像素密度的手机)然后TextView界限
Q2:有没有其他QUICK方法用指定的textSize确定某些文本的宽度和高度?
我知道,宽度可以由Paint.measureText()确定,但这不会返回高度.高度可以通过创建new StaticLayoutwith text然后调用StaticLayout.getHeight()来确定,但这太慢了.我需要更快的东西.
所有这一切的背景是AutoFitTextView通过向上或向下缩放文本大小自动将文本放入其边界内,并且它应该快速完成,因为很多这样AutoFitTextView的动态会很快动态变化.
使用画布,我想绘制一些适合某些指定矩形的短标签文本(1-2个字符).由于某些其他原因,我使用的缩放使得该重新纠缠的尺寸很小,即约1.
我面临的问题是计算最佳(尽可能大,以便文本仍然适合)文本大小,以便Paint.setTextSize在绘制文本之前使用(我使用Canva.drawText()).为此我可以使用该Paint.Fontmetrics对象将一些常规字体尺寸作为浮点数或getTextBounds(String text, int start, int end, Rect bounds)将文本的边界框作为整数矩形.由于我使用的缩放,后者的整数边界框是不精确的,以便为我的目的计算最佳文本大小.
我需要的是一些方法来获得更高精度的文本边界框(例如getStringBounds(String str, Graphics context)in java.awt.FontMetrics),但我找不到合适的方法.
我试图在Android中显示TextView,使视图中的文本顶部对齐:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create container layout
FrameLayout layout = new FrameLayout(this);
// Create text label
TextView label = new TextView(this);
label.setTextSize(TypedValue.COMPLEX_UNIT_PX, 25); // 25 pixels tall
label.setGravity(Gravity.TOP + Gravity.CENTER); // Align text top-center
label.setPadding(0, 0, 0, 0); // No padding
Rect bounds = new Rect();
label.getPaint().getTextBounds("gdyl!", 0, 5, bounds); // Measure height
label.setText("good day, world! "+bounds.top+" to "+bounds.bottom);
label.setTextColor (0xFF000000); // Black text
label.setBackgroundColor(0xFF00FFFF); // Blue background
// Position text label
FrameLayout.LayoutParams …Run Code Online (Sandbox Code Playgroud) 我试图得到一个文本字符串的宽度,我得到的值为8,这不会产生,因为这意味着每个字母都是1个像素.我有以下代码
Rect bounds = new Rect();
Paint paint = new Paint();
paint.setTextSize(12);
paint.getTextBounds("ABCDEFGHI", 0, 1, bounds);
width=bounds.right; // this value is 8
Run Code Online (Sandbox Code Playgroud)
bounds的值为0,0,8,9