检测android TextView中的剪辑

时间:2009-10-14 01:16:00

标签: android

我的android应用程序中有一个TextView,它有一个设置的宽度。它目前的重力是“center_horitonzal”和一个textSize(9sp)。我从sqlite数据库中提取值以放置此标签,并且某些值太大而无法放入当前textSize的TextView中。

有没有办法检测TextView中的文本是否会被剪裁?我想检测一下,然后降低字体直到它适合。 iPhone UILabel中有一个很好的属性可以处理这个名为“adjustToFit”(也有最小字体大小),我基本上都试图模仿它。

以下是我正在使用的TextView示例:

<TextView android:id="@+id/label5" android:layout_width="62px"
            android:layout_height="wrap_content" android:layout_x="257px"
            android:layout_y="169px" android:textSize="9sp" 
            android:textColor="#000"
            android:typeface="sans" android:textStyle="bold"
            android:gravity="center_horizontal" android:lines="1" />

3 个答案:

答案 0 :(得分:6)

我找到了一种使用TextView的Paint对象测量文本宽度的方法,并降低它直到它符合我需要的大小。这是一些示例代码:

    float size = label.getPaint().measureText(item.getTitle());
    while (size > 62) {
        float newSize = label.getTextSize() - 0.5f;
        label.setTextSize(newSize);
        size = label.getPaint().measureText(item.getTitle());
    }

答案 1 :(得分:0)

另一种方法(可能相同)是这样的:

        TextView title = new TextView(context) {
            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                int textsize = 30;
                setTextSize(textsize);
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                while (getMeasuredHeight() > MeasureSpec.getSize(heightMeasureSpec)) {
                    textsize--;
                    setTextSize(textsize);
                    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                }
            }
        };

只是警告这似乎有效,但我只是将它们放在一起 - 可能是一些可以测量TextView的边缘情况。

答案 2 :(得分:0)

我写了这个函数来修剪文本末尾的字母,直到满足一定的宽度要求。

0.38功能是设置我要用这个文字填充的屏幕的比例,在这种情况下,它是38%,因为我希望它覆盖~40%,包括填充。为我测试过的案例工作过。

使用此代码调用下面的函数

DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

double maxWidth = (double)metrics.widthPixels*0.38 - 1;
TextPaint painter = station.getPaint();

String left = item.getLocationName();
left = trimToLength(painter, left, maxWidth);


textView.setText(left);

这是函数

public String trimToLength(TextPaint painter, String initialText, double width)
{
    String message = initialText;
    String output = initialText;

    float currentWidth = painter.measureText(output);
    while (currentWidth > width)
    {
        message = message.substring(0, message.length()-1);

        output = message + "...";

        currentWidth = painter.measureText(output);
    }

    return output;
}