首先看上面的注释,意思是说宽度一定要设置成具体值,这个很好理解,要是宽度可以变化,这个控件就没有意义了。
代码中,首先算出可以显示文字的宽度:
int targetWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
然后设置最高值和最低值,相当于一个区间的两个端点:
float hi = maxSize;
float lo = minSize;
接下来:
final float threshold = 0.5f; // How close we have to be
这个是干什么的呢?看注释,个人理解就是设置字与字之间间距的一个临界值,后面会用到。
然后,下面的逻辑就是,先把文字大小设置成最大值,如果这个宽度比可显示宽度小,那就lo = maxSize;,并最终以这个大小显示,那为什么lo = maxSize;呢,我们要看到最后,设置大小的时候,
// Use lo so that we undershoot rather than overshoot
this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo);
也就是说,是以lo值去设置的,原因就是注释说的:Use lo so that we undershoot rather than overshoot
如果把大小设置成最大值之后,计算出来的宽度大于可显示宽度,那么就需要重新适配。先把大小设置成最小值,然后如果这时候小于可显示宽度,那么就可以在这个基础上进行放大,但是要保证在一定的范围内,这个范围就是hi - lo) > threshold,然后
size = (hi+lo)/2;
mTestPaint.setTextSize(size);
也就是取最大最小值的中间值,如果这时候又大于可显示宽度了,就是放太大了,就又需要缩小一点,把这个中间值作为最大值,再去跟最小值算中间值。如果还是小于可显示宽度,那就是放太小了,继续放大,把中间值作为最小值,再去跟最大值算中间值。循环进行,直到条件不满足。整个过程都是通过Paint对象去操作,算出合适的大小值之后再把TextView的字体大小设置成这个值。
接下来就是重写onMeasure、onTextChanged、onSizeChanged方法,并在里面调用refitText方法:
@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);
}
}
完成。
==============================================================
我自己从事 Android 开发,从业这么久,我也积累了一些珍藏的资料,分享出来,希望可以帮助到大家提升进阶
分享一份由几位大佬一起收录整理的Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
小结
有了这么多优秀的开发工具,可以做出更高质量的Android应用。
当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。
在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
如果你有需要的话,可以点击这里领取