0

如何计算字体大小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();

问题来了。在某些设备上,字体很小,并且它填充的文本视图不到一半,而其他设备上的字体太大,甚至不到一半。

输出代码来自一个设备,其中的字体大小要大得多。我检查了一些方法,可能会建议这两种方法,但都失败了:

    // 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
4

2 回答 2

1

如果您不介意使用文件夹名称根据屏幕大小定义文本大小,例如:

res/values-sw600dp/dimens.xml

dimens.xml 的内容

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="text_size">20sp</dimen>
</resources>

资源/值-w1024dp

dimens.xml 的内容

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="text_size">35sp</dimen>
</resources>

现在您可以直接在布局中使用特定于屏幕大小的文本大小:

我选择为我的文本 res/values/styles.xml 定义一个样式

<style name="Text">
    <item name="android:padding">5dp</item>
    <item name="android:paddingLeft">10dp</item>
    <item name="android:paddingRight">10dp</item>
    <item name="android:shadowColor">@color/Grey</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
    <item name="android:shadowRadius">1</item>
    <item name="android:textColor">@color/Black</item>
    <!-- Here the dimen/text_size is used -->
    <item name="android:textSize">@dimen/text_size</item>
    <item name="android:textStyle">bold</item>
    <item name="android:typeface">monospace</item>
    <item name="android:ellipsize">none</item>
    <item name="android:gravity">left</item>
    <item name="android:maxLines">1</item>
    <item name="android:background">@color/Transparent</item>
</style>

因为我动态地将 TextViews 添加到我的布局中,所以我定义了一个简单的 entry.xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="false" />

而已。当我扩展 entry.xml 布局时,文本大小将反映显示的大小。

您可以在此处阅读有关该技术的更多信息:http ://wptrafficanalyzer.in/blog/different-layouts-for-different-screen-sizes-in-android/

于 2013-11-02T14:54:11.863 回答
0

在这里,我发布了解决方案。我希望有人会给出比这更好的答案。

也可以是以下结果:1 行半...

在此处输入图像描述

一些测试设备数据:我很高兴看到我有 2 台设备具有相同的屏幕尺寸或屏幕尺寸比例或 android 版本或什么?:)

// Lenovo phone: DisplayMetrics{density=1.5, width=800, height=480, scaledDensity=1.6500001, xdpi=240.0, ydpi=240.0}        width/height: 1.666
// Lenovo tablet: DisplayMetrics{density=1.0, width=1024, height=552, scaledDensity=1.0, xdpi=160.0, ydpi=160.0}            width/height: 1.85
// Samsung tablet: DisplayMetrics{density=1.0, width=1280, height=752, scaledDensity=1.0, xdpi=149.82489, ydpi=150.51852}   width/height: 1.7
// THL phone:  DisplayMetrics{density=3.0, width=1920, height=1080, scaledDensity=3.3000002, xdpi=480.0, ydpi=480.0}        width/height: 1.77

哦,由于不同的宽度/高度比,文本不会以相同的单词结尾。它可能恰好只有 1 行,而在其他设备上需要 2 行......

        // get the text size
        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; // large screens need a lower number, smaller screens a higher number.
        // Samsung tablet 1.4
        // THL phone 1.6
        // Lenovo phone: 2.2
        // Lenovo table 1.8

        float size = textSize / (fuckingMagic * scaleFactor);
于 2013-11-02T14:50:00.347 回答