Фон
Багато разів нам потрібно автоматично підлаштовувати шрифт TextView до заданих йому меж.
Проблема
На жаль, незважаючи на те, що існує багато тем і публікацій (і запропонованих рішень), які говорять про цю проблему (наприклад, тут , тут і тут ), жодна з них насправді не працює добре.
Тому я вирішив протестувати кожен з них, поки не знайду справжню угоду.
Я думаю, що вимоги до такого textView повинні бути:
Дозволяє використовувати будь-який шрифт, шрифт, стиль та набір символів.
Слід обробляти ширину і висоту
Жодне укорочення, якщо текст не може поміститися через обмеження, яке ми надали до нього (приклад: занадто довгий текст, занадто малий доступний розмір). Однак ми можемо запросити горизонтальну / вертикальну смугу прокрутки, якщо бажаємо, саме для цих випадків.
Слід допускати багаторядкові або однолінійні. У випадку багаторядкових дозвольте максимум та хв.
Не повинно бути повільним у обчисленні. Використовуєте цикл для пошуку найкращого розміру? Принаймні оптимізуйте його та не збільшуйте вибірки на 1 раз.
У випадку багаторядкових, слід дозволити віддати перевагу зміні розміру або використовувати більше рядків та / або дозволити самостійно вибирати лінії за допомогою символу "\ n".
Що я спробував
Я спробував так багато зразків (включаючи ті посилання, про які я писав), і також намагався модифікувати їх для обробки справ, про які я говорив, але жоден насправді не працює.
Я зробив зразок проекту, який дозволяє мені візуально бачити, чи TextView автоматично підходить правильно.
Наразі мій зразок проекту лише рандомізує текст (англійський алфавіт плюс цифри) та розмір textView, і нехай він залишається одним рядком, але навіть це не працює добре на жодному з зразків, які я пробував.
Ось код (також доступний тут ):
Файл res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity">
<Button android:id="@+id/button1" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" android:text="Button" />
<FrameLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_above="@+id/button1"
android:layout_alignParentLeft="true" android:background="#ffff0000"
android:layout_alignParentRight="true" android:id="@+id/container"
android:layout_alignParentTop="true" />
</RelativeLayout>
Файл 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<textLength;++i)
builder.append(ALLOWED_CHARACTERS.charAt(_random.nextInt(ALLOWED_CHARACTERS.length())));
return builder.toString();
}
}
Питання
Хтось знає про рішення цієї поширеної проблеми, яка насправді працює?
Навіть рішення, яке має набагато менше функцій, ніж те, про що я писав, наприклад, яке має лише постійну кількість рядків тексту та коригує його шрифт відповідно до його розміру, але ніколи не має дивних глюків і текст надто надходить великий / малий порівняно з наявним ним простором.
Проект GitHub
Оскільки це така важлива TextView, я вирішив опублікувати бібліотеку, щоб кожен міг легко використовувати його, і внести свій вклад в це, тут .