我一直在寻找一种在textview中自动调整文本的方法 . 通过我的搜索,我找到了许多解决方案,如:
但和许多其他人一样,这些并不能解决我的问题 . 当我们使用带有多行的TextView时,它们无法按预期工作 .
基本上我的目标是这个:
如您所见,文本根据宽度,高度调整大小,并注意换行,创建多行文本视图 . 也可以改变字体 .
我解决这个问题的一个想法是这样的:
int size = CONSTANT_MAX_SIZE;
TextView tv = (TextView) findViewById(R.id.textview1)
while(Math.abs(tv.getMeasuredHeight()) >= TEXTVIEW_MAX_HEIGHT) {
size--;
tv.setTextSize(size);
tv.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);
i++;
}
CONSTANT_MAX_SIZE是一个常量,用于定义字体的最大大小(TextView中的textsize礼节)
TEXTVIEW_MAX_HEIGHT是一个常量,用于定义textview可以具有的最大大小 .
每次textview中的文本发生更改时都会调用此方法 .
textview xml是这样的:
<TextView
android:id="@+id/textview1"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:singleLine="false"
android:inputType="textMultiLine"
android:text=""
android:textSize="150sp" />
由于宽度在XML中受到限制,因此只需要考虑视图的高度,因为调整它后android会在需要时自动创建多行 .
虽然这是一个潜在的解决方案并不完美(远离它)并且它不支持调整大小(当您删除文本时) .
任何sugestions和/或想法?
6 回答
当我等待这个问题的可能解决方案时,我一直在试验并试图找出它 .
这个问题的最接近的解决方案是基于paint的方法 .
基本上paint有一个叫做'breaktext'的方法,它有:
我将它与绘画'getTextBounds'结合起来:
所以现在我可以获得适合给定宽度和那些字符高度的字符数 .
使用一段时间,您可以继续从要测量的字符串移动删除字符并获取行数(通过使用while(index <string.length))并将其乘以getTextBounds中获得的高度 .
此外,您必须为每两行代表行之间的空间添加一个可变高度(在getTextBounds中不计算) .
作为示例代码,知道多行文本高度的函数是这样的:
注意:maxWidth变量以像素为单位
然后你必须在一段时间内调用这个方法来确定该高度的最大字体大小 . 示例代码是:
不幸的是,这是我能够从上面的图像中获得方面的唯一方法(据我所知) .
希望这对任何试图克服这一障碍的人都有帮助 .
你对这个问题有一个很好的解决方案,但我从不同的角度来看这个问题 . 我认为逻辑更简单,更容易理解,至少对于新的android开发人员来说 . 这个想法是通过在大字符串的空格之间插入'\ n'字符来实现的 . 然后,我将textView的编辑后的字符串设置为显示文本 . 所以,这是代码..
参数很简单 . Str是我们要编辑的字符串,变量步骤定义方法将插入'/ n'字符的空格数 . 然后,你只需要这样调用:
希望这有助于你们许多人不想深入了解TextPaint,Rects和数学函数 .
谢谢你的解决方案,你是超人!我已在TextView的派生类中实现了您的代码 . 代码转换为Xamarin android的C#代码 . 如果需要,可以轻松转换为Java(删除Java的第一个构造函数) .
这是AXML代码
有点改进了phamducgiam的答案 . 它显示的文字已经适合大小,而不是显示后的skretchs . 因为启动textSize 100而在编辑器中看起来很丑,但是在运行时应该正常工作 . 这里的码:
使用the idea from nunofmendes,我编写了一个TextView派生类,它自动调整文本大小并支持多行 .
可编译的固定代码:复制粘贴这个,而不是接受的,因为你需要修复它:)
需要用,谢谢 .
Important: You need to consider the scale factor