Динамическое масштабирование текста для обеспечения его соответствия тексту в одной строке - PullRequest
1 голос
/ 20 февраля 2012

Я пытаюсь создать текстовое представление, которое масштабирует содержимое таким образом, чтобы все это отображалось, без обрезки, многострочного текста или элипсиса.

Я быстро пробежусь по макету, просто чтобы поместить его в контекст.

* Существует вид сетки с несколькими строками и столбцами.* Элементы для сетки отображаются с помощью адаптера, который возвращает (псевдо-разметка :)): -

<LinearLayout Orientation=vertical>
    <MyCustomTextview name='titletext' Not multiline />
    <MyCustomTextview name='itemtext' Not multiline />
</LinearLayout>

Я попытался переопределить onSizeChanged, так как именно здесь меня указали несколько результатов Google, и я начал с:-

...
if (this.getLinecount() > 1)
{
    this.setTextSize(... currentsize -10);
}
...

и это дало мне действительно маленький текст, где он мог бы появиться более чем на одной строке, поэтому я знал, что могу изменить размер и выяснить, правильно ли в TextView более одной строки.

поэтому я перешел к: -

while (this.getLinecount() > 1)
{
    this.setTextSize(... currentsize - 1);
}

, который я ожидал запустить до тех пор, пока текст не стал достаточно маленьким, но после вызова setTextSize getLineCount () возвращает 0, я считаю, что это потому, что ему нужнопересчитать размер текста, чтобы я попробовал различные комбинации refreshLayout (), forceLayout () и invalidate () безрезультатно.

У меня есть идея для лучшего подхода, но я не знаю, если этолегко достижимо: -

onSizeChanged вызывается после того, как он добавлен в Gridview адаптером, поэтому я выполню там свой код, но возможно ли следующее и как: -

  • TextView настроен на ширину родительской заливки. Могу ли я точно определить размер пикселя ширины доступного пространства для текста?(Я полагаю, что могут быть дополнения и тому подобное)
  • Затем я намереваюсь использовать measureText (String), чтобы увидеть, подойдет ли текст, если нет, уменьшите размер и проверьте еще раз.

Я считаю, что это было бы хорошим решением, но я не уверен в точном измерении доступного пространства, и если бы выбранное мной событие было бы лучшим.

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

  • Энтони

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Для этого вам не нужно создавать пользовательский текстовый просмотр.Используйте ViewTreeObserver для получения необходимой функциональности.

TextView tv = (TextView)findViewById(R.id.mytextview); 
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(this);

@Override
public void onGlobalLayout() {
    if (1 < tv.getLineCount()) {
        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                tv.getTextSize() - 2);
    }
}
0 голосов
/ 20 февраля 2012

Почему бы вам не попробовать такой же подход, но вместо этого использовать measureText?

while (mPaint.measureText(MyTextString)>mTextView.getWidth() ) //maybe adjust for padding/margins etc
{
    mPaint.setTextSize(... currentsize - 1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...