android textview 计算字体大小以适应给定的边界

10 浏览
0 Comments

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

0
0 Comments

问题的出现的原因是在不同的设备上,由于屏幕尺寸或比例等原因,文本的行数可能不同,因此需要根据给定的边界计算字体大小以适应。

解决方法是通过循环逐渐减小字体大小,直到多行文本的高度小于给定边界的最大高度。然后根据设备的密度和一个名为"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"系数的具体值,根据不同设备的测试数据,可以在不同的设备上调整,以使得文本在不同设备上都能适配合适的字体大小。

0
0 Comments

在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

0