Я начал с решения Chase, но мне пришлось адаптировать две вещи до того, как он работал на моем устройстве (Galaxy Nexus, Android 4.1):
// 1. in resizeText()
if (mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) {
// Draw using a static layout
// modified: use a copy of TextPaint for measuring
TextPaint paint = new TextPaint(textPaint);
// 2. in getTextHeight()
private int getTextHeight(CharSequence source, TextPaint originalPaint, int width, float textSize) {
// modified: make a copy of the original TextPaint object for measuring
// (apparently the object gets modified while measuring, see also the
// docs for TextView.getPaint() (which states to access it read-only)
TextPaint paint = new TextPaint(originalPaint);
// Update the text paint object
paint.setTextSize(textSize);
...
// modified: setting text size via this.setTextSize (instead of textPaint.setTextSize(targetTextSize))
setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSize);
setLineSpacing(mSpacingAdd, mSpacingMult);
С этими двумя изменениями решение отлично работает для меня, благодаря Chase! Я не знаю, связано ли это с Android 4.x, что исходное решение не работает. Если вы хотите увидеть его в действии или проверить, действительно ли он работает на вашем устройстве, вы можете посмотреть мое приложение флеш-карты Flashcards ToGo , где я использую это решение для масштабирования текста флеш-карты. Текст может иметь произвольную длину, и карточки будут отображаться в разных действиях, иногда поменьше, иногда больше, плюс в режиме пейзажа + портрет, и я не нашел ни одного углового случая, когда решение не будет работать должным образом ...