很多时候,我们需要将TextView的字体自动调整到给定的边界.
可悲的是,即使有很多线程和帖子(和建议的解决方案)谈论这个问题(例如这里,这里和这里的例子),它们都没有真正运作良好.
这就是为什么,我决定测试每一个,直到找到真正的交易.
我认为来自这样一个textView的要求应该是:
应允许使用任何字体,字体,样式和字符集.
应该处理宽度和高度
没有截断,除非文本由于限制而无法适应,我们已经给它(例如:文本太长,可用大小太小).但是,如果我们愿意,我们可以请求水平/垂直滚动条,仅适用于那些情况.
应该允许多线或单线.如果是多行,请允许最大和最小行.
计算速度不应该慢.使用循环找到最佳尺寸?至少要优化它,不要每次增加1个采样.
在多行的情况下,应该允许更喜欢调整大小或使用更多行,和/或允许使用"\n"字符自己选择行.
我已经尝试了很多样本(包括链接的那些,我已经写过了),而且我也尝试修改它们来处理这些情况,我已经谈过了,但没有一个真正起作用.
我做了一个示例项目,让我可以直观地看到TextView是否正确自动匹配.
目前,我的示例项目只是随机化文本(英文字母加上数字)和textView的大小,并让它保持单行,但即使这样也不适用于我尝试的任何样本.
这是代码(也可在此处获得):
res/layout/activity_main.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity">
<Button android:id="@+id/button1" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" android:text="Button" />
<FrameLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_above="@+id/button1"
android:layout_alignParentLeft="true" android:background="#ffff0000"
android:layout_alignParentRight="true" android:id="@+id/container"
android:layout_alignParentTop="true" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
src/.../MainActivity.javapublic class MainActivity extends Activity
{
private final Random _random =new Random();
private static final String ALLOWED_CHARACTERS ="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState); …Run Code Online (Sandbox Code Playgroud) 我正在测量文本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) android中是否有任何方法可以调整textview中的文本大小以适应它占用的空间?
例如,我正在使用a TableLayout并TextView在每行中添加几个s.由于我不希望TextViews包装文本,我宁愿看到它降低了内容的字体大小.
有任何想法吗?
我试过measureText,但由于我不知道列的大小,使用起来似乎很麻烦.这是我想要将字体大小更改为适合的代码的代码
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
Run Code Online (Sandbox Code Playgroud) 有没有直接测量文字高度的方法?我现在这样做的方法是使用Paint measureText()来获取宽度,然后通过试验和错误找到一个值来获得近似高度.我也一直在搞乱FontMetrics,但所有这些似乎都是近似的方法.
我正在尝试扩展不同分辨率的东西.我可以做到,但我最终得到了令人难以置信的冗长代码,并通过大量计算来确定相对大小.我讨厌它!一定有更好的方法.
我正在尝试创建一种方法来调整多行文本的大小TextView,使其适合于(在X和Y维度)的范围内TextView.
目前,我有一些东西,但它所做的只是调整文本大小,使文本的第一个字母/字符填充尺寸TextView(即只有第一个字母是可见的,而且它是巨大的).我需要它来适应TextView边界内的所有文本行.
这是我到目前为止:
public static void autoScaleTextViewTextToHeight(TextView tv)
{
final float initSize = tv.getTextSize();
//get the width of the view's back image (unscaled)....
float minViewHeight;
if(tv.getBackground()!=null)
{
minViewHeight = tv.getBackground().getIntrinsicHeight();
}
else
{
minViewHeight = 10f;//some min.
}
final float maxViewHeight = tv.getHeight() - (tv.getPaddingBottom()+tv.getPaddingTop())-12;// -12 just to be sure
final String s = tv.getText().toString();
//System.out.println(""+tv.getPaddingTop()+"/"+tv.getPaddingBottom());
if(minViewHeight >0 && maxViewHeight >2)
{
Rect currentBounds = new Rect();
tv.getPaint().getTextBounds(s, 0, s.length(), currentBounds);
//System.out.println(""+initSize);
//System.out.println(""+maxViewHeight);
//System.out.println(""+(currentBounds.height())); …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种在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++;
}
Run Code Online (Sandbox Code Playgroud)
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" />
Run Code Online (Sandbox Code Playgroud)
由于宽度在XML中受到限制,因此只需要考虑视图的高度,因为调整它后android会在需要时自动创建多行.
虽然这是一个潜在的解决方案并不完美(远离它)并且它不支持调整大小(当您删除文本时).
任何sugestions和/或想法?
我有一个RecyclerView包含CardViews TextView和a ImageView,以及其他一些布局的s .
问题是,在某些屏幕分辨率TextView下,它会被切断或推到下一行,这是我不想要的.
在其他决议中,TextView有足够的空间.
如何组织布局,以便有足够的空间TextView,并相应ImageView地调整大小?
这是我的RecyclerView项目的xml :
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
android:id="@+id/zmanCard"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
cardview:cardUseCompatPadding="false"
cardview:cardPreventCornerOverlap="false"
cardview:cardCornerRadius="4dp"
cardview:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorPrimary"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="top"
android:gravity="center"
android:orientation="vertical"
android:background="?attr/colorPrimaryDark">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/zmanCardTitle"
android:textColor="#ffffff"
android:gravity="center"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="24dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="4dp"
android:alpha="0.8"
android:id="@+id/zmanCardImage" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="4dp">
<TextView …Run Code Online (Sandbox Code Playgroud) 我正在努力实现这个结果:
我现在所拥有的是ConstraintLayout包括三个Views:TextView,ImageView,ImageView
设计要求:
TextView;TextView 固定大小为80dpImageViews应根据文本位置水平改变位置TextView.请参见案例#1 /#2的图像以供参考.是否可以用XML实现第4项?那么以编程方式呢?
[附加信息]
自动调整大小无法正常工作wrap_content,请参阅自动调整文档:
注意:如果在XML文件中设置自动调整大小,则不建议对TextView
layout_width或layout_height属性使用值"wrap_content" .它可能会产生意外的结果.
android textview autoresize imageview android-constraintlayout
假设我有一个特定大小的TextView(真正重要的是什么...... fill_parent,20dip,等等).是否有可能告诉文本缩小/增大尺寸以适应可用空间而无需进行大量数学运算?
我正在寻找一种方法,当我更改屏幕大小时,它将按比例调整文本大小.目前我尝试将 Auto Scale TextView Text设置为Bounds但它似乎没有工作.但我不确定我是否以正确的方式做到了.我现在正打电话来
AutoResizeTextView test = new AutoResizeTextView(this);
test=(AutoResizeTextView)findViewById(R.id.test456);
test.resizeText(); // I call this to resize.. am I right?
Run Code Online (Sandbox Code Playgroud)
XML
<com.mypackage.AutoResizeTextView
android:id="@+id/test456"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
Run Code Online (Sandbox Code Playgroud) android ×10
textview ×8
font-size ×2
android-xml ×1
autoresize ×1
autosize ×1
graphics ×1
imageview ×1
layoutparams ×1
resize ×1
text-size ×1
typeface ×1
view ×1
word-wrap ×1