Подтвердить что ты не робот

Масштабирование textSize в TextView

Скажем, у меня есть TextView определенного размера (не имеет значения, что... fill_parent, 20dip, что угодно). Можно ли сказать, что текст будет уменьшаться/расти в размерах, чтобы соответствовать свободному пространству, не делая много математики?

4b9b3361

Ответ 1

Не то, чтобы я знаю, извините.

Ответ 2

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

    // HACK to adjust text width
    final int INITIAL_TEXTSIZE = 15;
    final int TEXTVIEW_WIDTH = textviewBackground.getIntrinsicWidth(); // I use the background image to find the width, but you can use a fixed value or whatever other method you prefer.
    final String text = ...;
    textView.setText( text );

    int size = INITIAL_TEXTSIZE;
    while( textview.getPaint().measureText(text) > TEXTVIEW_WIDTH )
        textview.setTextSize( --size );

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

Не сказать, что это идеальное решение, но это целесообразно, если вам не нужно часто корректировать свои тексты. Если вам нужно часто корректировать текст, лучше сделать некоторые сложные математические модели.

Ответ 3

Я опробовал почти все вышеперечисленное, и большинство из них были неудачными, включая верхний. Самый простой и эффективный я нашел от emmby, но обнаружил, что вам нужно было установить исходный текст. Здесь улучшается его, где вам не нужно указывать какие-либо тексты вообще:

  final String text = "HELP";

  TextView tvFlash = (TextView) findViewById(R.id.tvFlash);

  DisplayMetrics metrics = getResources().getDisplayMetrics();
  int width = metrics.widthPixels;
  int height = metrics.heightPixels;

  tvFlash.setText(text);
  tvFlash.setTextSize(TypedValue.COMPLEX_UNIT_PX, 1);

  int size = 1; 

  do
  {
    float textWidth = tvFlash.getPaint().measureText(text);

    if (textWidth < width)
      tvFlash.setTextSize(++size);
    else
    {
      tvFlash.setTextSize(--size);
      break;
    }
  }while(true);

Ответ 4

U может вычислять значение размера шрифта идеи для TextView. Это размер шрифта, который заполнит его, не будучи слишком большим. Формула:

fontSize = (TextView Height) * (width DPI / height DPI) / (Screen Width * Screen Height);

Ширина и высота DPI могут быть получены путем переопределения метода onConfigurationChanged в вашей активности и использования newConfig.screenWidthDp и newConfig.screenHeightDp.

Размер экрана в пикселях можно получить с помощью следующей вспомогательной функции

// Get Screen Size
static public Point getScreenSize(Activity aActivity)
{
    Display display = aActivity.getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    return size;
}

Я просто вычисляю это значение по мере необходимости (в onConfigurationChanged) и нажимаю его на некоторый статический вспомогательный класс. Затем, когда TextView должен определить, какой размер шрифта использовать, он вытаскивает его из этого класса.

Он работает, но может и не быть самым простым решением.