Автоматическая подгонка TextView для Android

Фон

Много раз нам нужно автоматически подгонять шрифт TextView к заданным границам.

Эта проблема

К сожалению, даже несмотря на то, что есть много тем и сообщений (и предлагаемых решений), говорящих об этой проблеме (примерВот,Вот а такжеВот), ни один из них на самом деле не работает хорошо.

Тот'почему яМы решили проверить каждый из них, пока я не найду реальную сделку.

Я думаю, что требования от такого textView должны быть:

Должно позволять использовать любой шрифт, шрифт, стиль и набор символов.

Должен обрабатывать ширину и высоту

Нет усечения, если текст не может поместиться из-за ограничения, мымы дали ему (пример: слишком длинный текст, слишком маленький доступный размер). Тем не менее, мы можем запросить горизонтальную / вертикальную полосу прокрутки, если мы хотим, только для этих случаев.

Следует разрешить многострочное или однострочное. В случае многострочного, позвольте max & мин строк.

Не должно быть медленным в вычислениях. Используя петлю для поиска лучшего размера? По крайней мере, оптимизировать его и неt увеличивайте выборку на 1 каждый раз.

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

Что я'мы пытались

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

Мы сделали пример проекта, который позволяет мне визуально увидеть, правильно ли подходит TextView.

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

Вот'с кодом (также доступенВот):

файлres/layout/activity_main.xml

  
  


файлsrc/.../MainActivity.java
public class MainActivity extends Activity
  {
  private final Random        _random            =new Random();
  private static final String ALLOWED_CHARACTERS ="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";

  @Override
  protected void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ViewGroup container=(ViewGroup)findViewById(R.id.container);
    findViewById(R.id.button1).setOnClickListener(new OnClickListener()
      {
        @Override
        public void onClick(final View v)
          {
          container.removeAllViews();
          final int maxWidth=container.getWidth();
          final int maxHeight=container.getHeight();
          final FontFitTextView fontFitTextView=new FontFitTextView(MainActivity.this);
          final int width=_random.nextInt(maxWidth)+1;
          final int height=_random.nextInt(maxHeight)+1;
          fontFitTextView.setLayoutParams(new LayoutParams(width,height));
          fontFitTextView.setSingleLine();
          fontFitTextView.setBackgroundColor(0xff00ff00);
          final String text=getRandomText();
          fontFitTextView.setText(text);
          container.addView(fontFitTextView);
          Log.d("DEBUG","width:"+width+" height:"+height+" text:"+text);
          }
      });
    }

  private String getRandomText()
    {
    final int textLength=_random.nextInt(20)+1;
    final StringBuilder builder=new StringBuilder();
    for(int i=0;i

Ответы на вопрос(15)

Ваш ответ на вопрос