Автоподбор текста с многострочной поддержкой

я искал решения для автоматической подгонки шрифта textView в соответствии с его размером и нашел много, но ни один из них не поддерживает многострочные и делает это правильно (без усечения текста, а также с учетом значений гравитации).

кто-нибудь еще проводил решение как таковое?

также возможно установить ограничение на то, как найти оптимальное количество строк? может быть, в соответствии с максимальным размером шрифта или максимальным количеством символов в строке?


person android developer    schedule 30.08.2012    source источник
comment
Было бы полезно, если бы вы перечислили решения, которые вы пробовали, и почему каждое из них не работает для вас, чтобы сэкономить всем время :)   -  person Joe    schedule 30.08.2012
comment
как я уже писал, я пробовал как минимум 5 решений на этом веб-сайте, и ни одно из них не поддерживало многострочное использование, использование гравитации и правильное отображение текста.   -  person android developer    schedule 31.08.2012
comment
Если вы пропустили это, я предлагаю перечислить решения, которые вы пробовали.   -  person Joe    schedule 01.09.2012
comment
не помню что пробовал. Я пробовал по крайней мере 5 из них. вот несколько ссылок, которые я помню, которые я посетил: stackoverflow.com/questions/5033012/ stackoverflow.com/questions/2596452/   -  person android developer    schedule 01.09.2012


Ответы (2)


Следующее работает для меня, ИМХО, лучше, чем использование решения на основе эллипса.

void adjustTextScale(TextView t, float max, float providedWidth, float providedHeight) {

    // sometimes width and height are undefined (0 here), so if something was provided, take it ;-)
    if (providedWidth == 0f)
        providedWidth = ((float) (t.getWidth()-t.getPaddingLeft()-t.getPaddingRight()));
    if (providedHeight == 0f)
        providedHeight = ((float) (t.getHeight()-t.getPaddingTop()-t.getPaddingLeft()));

    float pix = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());

    String[] lines = t.getText().toString().split("\\r?\\n");

    // ask paint for the bounding rect if it were to draw the text at current size
    Paint p = new Paint();
    p.setTextScaleX(1.0f);
    p.setTextSize(t.getTextSize());
    Rect bounds = new Rect();
    float usedWidth = 0f;

    // determine how much to scale the width to fit the view
    for (int i =0;i<lines.length;i++){
        p.getTextBounds(lines[i], 0, lines[i].length(), bounds);
        usedWidth = Math.max(usedWidth,(bounds.right - bounds.left)*pix);
    }

    // same for height, sometimes the calculated height is to less, so use §µ{ instead
    p.getTextBounds("§µ{", 0, 3, bounds);
    float usedHeight = (bounds.bottom - bounds.top)*pix*lines.length;

    float scaleX = providedWidth / usedWidth;
    float scaleY = providedHeight / usedHeight;

    t.setTextSize(TypedValue.COMPLEX_UNIT_PX,t.getTextSize()*Math.min(max,Math.min(scaleX,scaleY)));


}
person Xnyle    schedule 18.10.2012
comment
где остальная часть кода? где мы должны вызвать эту функцию? и какая строка указана в getTextBounds? - person android developer; 18.10.2012

Позже я задал аналогичный вопрос и получил ответ на этот:

https://stackoverflow.com/a/17786051/878126

для пользовательского поведения необходимо соответствующим образом изменить код.

person android developer    schedule 14.09.2013