自定义TextView任意长度文本下自动改变文字大小以完全显示

前段时间开发了一个新的需求,其中一个列表下有几个文本,根据UI的设计设置了文本大小,开发完成后,在测试中文本显示也没发现异常,后来随着业务的增加,发现部分文本的内容很长,在低分辨率的手机上没法完全显示,而IOS端则没有发现这个问题,一交流,IOS说是他们那边的文本显示能实现自动缩放大小以完全显示。现在琢磨着通过自定义的方式实现文本自动缩放大小以完全显示并充满的功能。

大致思路是:自定义TextView, 重写onDraw方法。在其中获取TextView的宽度以及设定的字体大小,文本内容与边框的距离,TextView中设置的drawableLeft/Right/Top/Buttom,获取欲设置的文本长度,然后再在各项之间逐一匹配。具体如下:

private void adaptivText(String text) {
    if(TextUtils.isEmpty(text)){
        return;
    }
    mTextSize = getTextSize();//返回值的单位是px
    mPaint = new Paint();
    mPaint.set(getPaint());
    int drawableWidth = 0;//drawableLeft/Right/Top/Buttom文本内容四周的图片宽度
    Drawable[] drawableCompound = getCompoundDrawables();
    for (int i = 0; i < drawableCompound.length; i++) {
        if(drawableCompound[i]!= null){
            drawableWidth += drawableCompound[i].getBounds().width();
        }
    }
    //获得当前TextView仅仅是显示文本内容的区域宽度
	//              TextView总宽度  xml文件中的PaddingLeft  文本内容四周的图片宽度
    int maybeWidth = getWidth() - getPaddingLeft() - drawableWidth -
	//               xml文件中的PaddingRight   文本内容四周的图片距离边框的距离
	                 getPaddingRight() - getCompoundDrawablePadding();
    float textWidth =  mPaint.measureText(text);text纯文本所占据的宽度
    while(textWidth > maybeWidth){
        mPaint.setTextSize(--mTextSize);
        textWidth = mPaint.measureText(text);
    }
    //setTextSize() 的单位是sp,因此要转化一次:px ---→ sp
    this.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
}

然后再onDraw方法中supper方法之后调用。

参照网上大佬的经验,经过多次调试修改做了如上优化,有了结果,但内存耗费比较高,部分内容可以提到onLayout方法中操作,以降低内存占用空间,后面再做优化。最后效果图如下:

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值