在视图中缩放文本以适应尺寸?

8 浏览
0 Comments

在视图中缩放文本以适应尺寸?

我不相信这个存在,但还是想再确认一下。我想设置一个TextView的文本大小,使其适应给定的宽度,只显示一行。例子:


  

谢谢。

0
0 Comments

问题的出现原因是在某些设备上,使用上述方法会导致java.lang.StackOverflowError错误。解决方法是将getTextSize()返回的像素值转换为DIP单位,并确保setTextSize()方法接受的参数也是DIP单位。可以使用以下代码来解决这个问题:

while (mText != TextUtils.ellipsize(mText, textPaint, other params)) { 
    float textSizePx = textPaint.getTextSize();
    float textSizeDip = pxToDip(textSizePx);
    float newTextSizeDip = textSizeDip - 1;
    float newTextSizePx = dipToPx(newTextSizeDip);
    textPaint.setTextSize(newTextSizePx);
}
private float pxToDip(float px) {
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    return px / (displayMetrics.densityDpi / 160f);
}
private float dipToPx(float dip) {
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    return dip * (displayMetrics.densityDpi / 160f);
}

0
0 Comments

这个问题的出现原因是在某些设备上使用上述方法会导致java.lang.StackOverflowError错误。解决方法是修改代码,添加一个条件来避免出现这个错误。

具体的解决方法如下:

public static void shrinkTextToFit(float availableWidth, TextView textView,
                                   float startingTextSize, float minimumTextSize) {
    CharSequence text = textView.getText();
    float textSize = startingTextSize;
    textView.setTextSize(startingTextSize);
    while (text != (TextUtils.ellipsize(text, textView.getPaint(),
                                        availableWidth, TextUtils.TruncateAt.END))) {
        textSize -= 1;
        if (textSize < minimumTextSize) {
            break;
        } else {
            textView.setTextSize(textSize);
        }
        // 添加以下代码
        if (textSize == textView.getTextSize()) {
            break;
        }
    }
}

通过添加`if (textSize == textView.getTextSize())`条件,可以避免在某些设备上出现java.lang.StackOverflowError错误。

0
0 Comments

解决方法:

通过组合XML布局定义和Java代码,可以动态地定义文本的大小。可能需要一些计算和从dip单位到像素密度的参考信息,但一旦完成,它几乎可以保证解决所有情况下的问题。

原因:

问题是由于需要根据不同屏幕的像素密度动态调整文本大小而引起的。目前SDK没有提供直接解决这个问题的标志,因此需要进行一些计算和转换以实现这个功能。

0