Масштабирование размера текста в текстовом представлении

StackOverflow https://stackoverflow.com/questions/2294115

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Насколько мне известно, нет, извините.

Другие советы

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

    // 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, возможно, было бы лучше использовать двоичный поиск вместо линейного, чтобы найти правильный размер шрифта.

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

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

  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);

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

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

DPI по ширине и высоте можно получить, переопределив метод onConfigurationChanged в вашем activity и используя 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 необходимо определить, какой размер шрифта использовать, он извлекает его из этого класса.

Это работает, но, возможно, не самое простое решение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top