前段时间开发了一个新的需求,其中一个列表下有几个文本,根据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方法中操作,以降低内存占用空间,后面再做优化。最后效果图如下: