Автоматическая подгонка 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