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

标签 android font-size textview

android 中有什么方法可以调整 TextView 中的文本大小以适应它占用的空间吗?

例如我正在使用 TableLayout 并向每一行添加多个 TextView。因为我不希望 TextView 将文本换行,所以我宁愿看到它会降低内容的字体大小。

有什么想法吗?

我已经尝试过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());  

最佳答案

下面的解决方案包含了此处的所有建议。它从 Dunni 最初发布的内容开始。它使用类似于 gjpc 的二进制搜索,但它更具可读性。它还包括 gregm 的错误修复和我自己的错误修复。

import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;

public class FontFitTextView extends TextView {

    public FontFitTextView(Context context) {
        super(context);
        initialise();
    }

    public FontFitTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialise();
    }

    private void initialise() {
        mTestPaint = new Paint();
        mTestPaint.set(this.getPaint());
        //max size defaults to the initially specified text size unless it is too small
    }

    /* Re size the font so the specified text fits in the text box
     * assuming the text box is the specified width.
     */
    private void refitText(String text, int textWidth) 
    { 
        if (textWidth <= 0)
            return;
        int targetWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
        float hi = 100;
        float lo = 2;
        final float threshold = 0.5f; // How close we have to be

        mTestPaint.set(this.getPaint());

        while((hi - lo) > threshold) {
            float size = (hi+lo)/2;
            mTestPaint.setTextSize(size);
            if(mTestPaint.measureText(text) >= targetWidth) 
                hi = size; // too big
            else
                lo = size; // too small
        }
        // Use lo so that we undershoot rather than overshoot
        this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int height = getMeasuredHeight();
        refitText(this.getText().toString(), parentWidth);
        this.setMeasuredDimension(parentWidth, height);
    }

    @Override
    protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) {
        refitText(text.toString(), this.getWidth());
    }

    @Override
    protected void onSizeChanged (int w, int h, int oldw, int oldh) {
        if (w != oldw) {
            refitText(this.getText().toString(), w);
        }
    }

    //Attributes
    private Paint mTestPaint;
}

关于android - 如何调整文本字体大小以适应textview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781108/

相关文章:

英文单词之间的安卓泰米尔字体

android - 在android TextView中逐字换行

java - 意外的 NullPointerException 从构造函数分配数组

android - listview addFooterView 问题

java - libGDX Box2D 在从地面掉落之前转身

Javascript - 获取实际渲染的字体高度

android - jquery ui 选择菜单不会在 android 浏览器中滚动

css - 如何修改firefox Quantum dev工具字体?

jquery - 当文本太长时使用 jQuery 更改字体大小

android - ListView 中的 setOnItemClickListener 影响多行