为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2019-06-23 16:20:06
如何调整文本字体大小以适应文本视图Android中是否有任何方法来调整文本视图中的文本大小以适应它所占用的空间?我用的是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());
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

下面的解决方案包含了这里的所有建议。它从最初由Dunni发布的内容开始。它使用像gjpc这样的二进制搜索,但它的可读性更强一些。它还包括gregm的bug修复和我自己的bug修复。

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;}


查看完整回答
反对 回复 2019-06-23
?
富国沪深

TA贡献1790条经验 获得超9个赞

我编写了一个类,它扩展了TextView并完成了这个任务。它只是使用度量文本,如你所建议的。基本上,它有一个最大的文本大小和最小的文本大小(可以更改),它只是在它们之间的大小之间以递减1的方式运行,直到找到最适合的大小。不太优雅,但我不知道还有什么别的方法。

以下是代码:

import android.content.Context;import android.graphics.Paint;import android.util.AttributeSet;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() {
        testPaint = new Paint();
        testPaint.set(this.getPaint());
        //max size defaults to the intially specified text size unless it is too small
        maxTextSize = this.getTextSize();
        if (maxTextSize < 11) {
            maxTextSize = 20;
        }
        minTextSize = 10;
    }

    /* 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) {
            int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
            float trySize = maxTextSize;

            testPaint.setTextSize(trySize);
            while ((trySize > minTextSize) && (testPaint.measureText(text) > availableWidth)) {
                trySize -= 1;
                if (trySize <= minTextSize) {
                    trySize = minTextSize;
                    break;
                }
                testPaint.setTextSize(trySize);
            }

            this.setTextSize(trySize);
        }
    }

    @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);
        }
    }

    //Getters and Setters
    public float getMinTextSize() {
        return minTextSize;
    }

    public void setMinTextSize(int minTextSize) {
        this.minTextSize = minTextSize;
    }

    public float getMaxTextSize() {
        return maxTextSize;
    }

    public void setMaxTextSize(int minTextSize) {
        this.maxTextSize = minTextSize;
    }

    //Attributes
    private Paint testPaint;
    private float minTextSize;
    private float maxTextSize;}


查看完整回答
反对 回复 2019-06-23
  • 3 回答
  • 0 关注
  • 756 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信