android textview 计算字体大小以适应给定的边界
android textview 计算字体大小以适应给定的边界
如何计算TextView
的字体大小,以适应我定义的边界包含多行文本?
我有一个TextView
放在一个RelativeLayout
中。在运行时将会得知App的屏幕大小,基于此进行计算。
Rect boundsTv = TextPositions.getTextViewBounds(1, mainActivity.mWidthPx, mainActivity.mHeightPx); Log.e("SlideLoader", "paint.boundsTv() left, right, top, bottom :"+boundsTv.flattenToString());//paint.boundsTv() left, right, top, bottom :163 363 1767 749 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tvText.getLayoutParams(); params.width = boundsTv.width();// right - left; params.height = boundsTv.height();// bottom - top; params.leftMargin = boundsTv.left; // Your X coordinate params.topMargin = boundsTv.top; // Your Y coordinate tvText.setLayoutParams(params); tvText.invalidate();
问题来了。在某些设备上,字体太小,只填充了TextView的一半,而在其他设备上,字体太大,甚至都不符合一半的要求。
输出的代码是来自一个设备,字体大小远远超过了要求。
我已经尝试了几种方法,可能会建议这两种方法,但都失败了:
// left, top - right, bottom TextPaint paint = tvText.getPaint(); paint.getTextBounds(text, 0, text.length()-1, boundsTv); Log.e("SlideLoader", "paint.getTextBounds() left, right, top, bottom :"+boundsTv.flattenToString());//paint.getTextBounds() left, right, top, bottom :2 -33 16049 9, how to interpret this values?! float width = paint.measureText(text);// for single line
问题的出现的原因是在不同的设备上,由于屏幕尺寸或比例等原因,文本的行数可能不同,因此需要根据给定的边界计算字体大小以适应。
解决方法是通过循环逐渐减小字体大小,直到多行文本的高度小于给定边界的最大高度。然后根据设备的密度和一个名为"fuckingMagic"的系数来调整字体大小,以便在不同大小的屏幕上都能适应。
下面是解决方法的代码实现:
// 获取文本大小 int textSize = 50; int maxHeight = boundsTv.height(); while (getHeightOfMultiLineText(text, textSize, params.width) > maxHeight) { textSize--; } float scaleFactor = mainActivity.getResources().getDisplayMetrics().density; float fuckingMagic = 1.8f; // 大屏幕需要较低的数字,小屏幕需要较高的数字 float size = textSize / (fuckingMagic * scaleFactor);
这段代码首先初始化字体大小为50,然后通过循环逐渐减小字体大小,直到多行文本的高度小于给定边界的最大高度。接下来,通过获取设备的密度和"fuckingMagic"系数的乘积来计算最终的字体大小,以便在不同大小的屏幕上都能适应。
至于"fuckingMagic"系数的具体值,根据不同设备的测试数据,可以在不同的设备上调整,以使得文本在不同设备上都能适配合适的字体大小。
在Android应用开发中,经常会遇到需要根据屏幕大小来计算合适字体大小的问题。解决这个问题的方法之一是使用不同尺寸的dimens.xml文件来定义不同屏幕大小下的字体大小。下面是具体的解决方法:
首先,在res文件夹下创建不同屏幕尺寸的文件夹,比如res/values-sw600dp和res/values-w1024dp。然后在这些文件夹下创建dimens.xml文件,并分别定义对应屏幕尺寸下的字体大小,如下所示:
res/values-sw600dp/dimens.xml
20sp
res/values-w1024dp/dimens.xml
35sp
接下来,在styles.xml文件中定义一个样式,其中使用了上面定义的字体大小:
然后,在需要显示文本的地方,引入上面定义的样式,并指定layout_width为match_parent,layout_height为wrap_content,如下所示:
这样,在加载布局时,文本的字体大小将根据屏幕尺寸自动调整。通过定义不同尺寸的dimens.xml文件和使用样式来设置字体大小,可以在不同屏幕上实现适应性布局。具体的实现细节可以参考这篇文章:http://wptrafficanalyzer.in/blog/different-layouts-for-different-screen-sizes-in-android/。
当然,这种方法需要在res目录下创建多个文件夹来适应不同的屏幕尺寸,比较繁琐。如果不需要为每个屏幕尺寸都定义不同的字体大小,那么可以考虑使用AutoResizeTextView库来实现自动调整字体大小的功能。这个库可以根据文本内容和控件大小自动计算合适的字体大小,适用于不同屏幕尺寸的适应性布局。具体使用方法可以参考这个库的GitHub页面:https://github.com/danclarke/AutoResizeTextView。