TextView设置文本自动调整大小

实现方案
  • 基础
TypedValue.applyDimension()方法的功能就是把非标准尺寸转换成标准尺寸, 如: 

dp->px:  TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());

in->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 20, context.getResources().getDisplayMetrics());

mm->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 20, context.getResources().getDisplayMetrics());

pt->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 20, context.getResources().getDisplayMetrics());

sp->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics());


计算文本Text宽度
/**
* 尾部打点之后还会继续计算并更新值
*/
public int getTextWidthTest(String text, int textSize){
    TextPaint paint = new TextPaint();
    float scaledDensity = getResources().getDisplayMetrics().scaledDensity;
    paint.setTextSize(textSize);
    Log.e("WJXView", paint.measureText(text) + " ");
    return (int) paint.measureText(text);
}


/**
* 尾部打点之后不会计算更新值
*/
private int getTextWidth(String text, int textSize)  {
    Paint paint  = new Paint();
    paint.setTextSize(textSize);
    float width = paint.measureText(text);
    Log.e("WJXText", (int) Math.round(0.5 + width) + " ");
    return (int) Math.round(0.5 + width);
}
根据TextView宽度自动计算适合的字体大小
  • 注意:
    • TextView的最大显示宽度可以通过从外层布局做减法计算获得
/**
* 获取TextView显示的最大宽度
*
* @return Max width
*/
public int getMaxSize() {
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    int maxWidth = displayMetrics.widthPixels;
    // 可以减掉外层的边距值
    return maxWidth;
}



/**
* 根据最大宽度返回适合的字体大小
*
* @param context C4当前上下文
* @param text 需要设置的字体
* @param textViewWidth 当前可依西安市的最大宽度
* @return 适合的字体大小
*/
private int getAutoTextSize(Context context, String text, int textViewWidth) {
    float textSize = NAME_MAX_SIZE;
    do {
        if (getTextWidth(text,
                (int) TypedValue.applyDimension(COMPLEX_UNIT_SP,
                        textSize, context.getResources().getDisplayMetrics()))
                <= textViewWidth){
            break;
        }
    } while (--textSize >= NAME_MIN_SIZE);
    return (int) textSize;
}
使用
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_text_size);
    TextView textView = findViewById(R.id.text_view);
    EditText editText = findViewById(R.id.edit_view);
    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            //Todo
        }


        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //Todo
        }


        @Override
        public void afterTextChanged(Editable s) {
            String text = editText.getText().toString();
            int maxWidth = getMaxSize();
            int autoSize = getAutoTextSize(getApplication(), text, maxWidth);
            textView.setTextSize(COMPLEX_UNIT_SP, autoSize);
            textView.setText(text);
        }
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值