相关疑难解决方法(0)

自动适应TextView for Android

背景

很多时候,我们需要将TextView的字体自动调整到给定的边界.

问题

可悲的是,即使有很多线程和帖子(和建议的解决方案)谈论这个问题(例如这里,这里这里的例子),它们都没有真正运作良好.

这就是为什么,我决定测试每一个,直到找到真正的交易.

我认为来自这样一个textView的要求应该是:

  1. 应允许使用任何字体,字体,样式和字符集.

  2. 应该处理宽度和高度

  3. 没有截断,除非文本由于限制而无法适应,我们已经给它(例如:文本太长,可用大小太小).但是,如果我们愿意,我们可以请求水平/垂直滚动条,仅适用于那些情况.

  4. 应该允许多线或单线.如果是多行,请允许最大和最小行.

  5. 计算速度不应该慢.使用循环找到最佳尺寸?至少要优化它,不要每次增加1个采样.

  6. 在多行的情况下,应该允许更喜欢调整大小或使用更多行,和/或允许使用"\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.java

public 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)

android font-size textview layoutparams

229
推荐指数
5
解决办法
18万
查看次数

Android Paint:.measureText()vs .getTextBounds()

我正在测量文本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 android-layout

188
推荐指数
6
解决办法
9万
查看次数

如何调整文本字体大小以适应textview

android中是否有任何方法可以调整textview中的文本大小以适应它占用的空间?

例如,我正在使用a TableLayoutTextView在每行中添加几个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)

android font-size textview

178
推荐指数
10
解决办法
16万
查看次数

测量在Canvas(Android)上绘制的文本高度

有没有直接测量文字高度的方法?我现在这样做的方法是使用Paint measureText()来获取宽度,然后通过试验和错误找到一个值来获得近似高度.我也一直在搞乱FontMetrics,但所有这些似乎都是近似的方法.

我正在尝试扩展不同分辨率的东西.我可以做到,但我最终得到了令人难以置信的冗长代码,并通过大量计算来确定相对大小.我讨厌它!一定有更好的方法.

graphics android view android-canvas

119
推荐指数
4
解决办法
9万
查看次数

如何缩放/调整文本大小以适合TextView?

我正在尝试创建一种方法来调整多行文本的大小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)

android resize autosize textview

27
推荐指数
4
解决办法
9万
查看次数

如何根据视图最大尺寸在多行TextView上自动调整文本大小?

我一直在寻找一种在textview中自动调整文本的方法.通过我的搜索,我找到了许多解决方案,如:

但和许多其他人一样,这些并不能解决我的问题.当我们使用带有多行的TextView时,它们无法按预期工作.

基本上我的目标是这个:

阶段1 阶段2 第3阶段 第4阶段

如您所见,文本根据宽度,高度调整大小,并注意换行,创建多行文本视图.也可以改变字体.

我解决这个问题的一个想法是这样的:

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和/或想法?

android word-wrap textview text-size typeface

20
推荐指数
1
解决办法
2万
查看次数

TextView在某些分辨率下被削减

我有一个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)

android android-layout android-xml android-recyclerview

16
推荐指数
1
解决办法
2277
查看次数

如何垂直对齐TextView中的文本?

我正在努力实现这个结果:

预期结果

我现在所拥有的是ConstraintLayout包括三个Views:TextView,ImageView,ImageView

设计要求:

  1. 文字居中TextView;
  2. TextView 固定大小为80dp
  3. 文字大小应为AutoSizeable;
  4. ImageViews应根据文本位置水平改变位置TextView.请参见案例#1 /#2的图像以供参考.

是否可以用XML实现第4项?那么以编程方式呢?

[附加信息]

自动调整大小无法正常工作wrap_content,请参阅自动调整文档:

注意:如果在XML文件中设置自动调整大小,则不建议对TextViewlayout_widthlayout_height属性使用值"wrap_content" .它可能会产生意外的结果.

android textview autoresize imageview android-constraintlayout

16
推荐指数
1
解决办法
386
查看次数

在TextView中缩放textSize

假设我有一个特定大小的TextView(真正重要的是什么...... fill_parent,20dip,等等).是否有可能告诉文本缩小/增大尺寸以适应可用空间而无需进行大量数学运算?

android textview

12
推荐指数
2
解决办法
8611
查看次数

自动缩放文本大小

我正在寻找一种方法,当我更改屏幕大小时,它将按比例调整文本大小.目前我尝试将 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 textview

9
推荐指数
1
解决办法
1万
查看次数