在视图中缩放文本以适应尺寸?
问题的出现原因是在某些设备上,使用上述方法会导致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); }
这个问题的出现原因是在某些设备上使用上述方法会导致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错误。