Масштабируемый TextView
Помогите пожалуйста настроить масштабирование TextView.
Всё, что касается параметров app:autoSizeTextType="uniform" и android:breakStrategy="simple" я перепробовал. Масштаб меняется, но не для всех случаев. Мне нужно, чтобы масштабирование текста работало для слов любой длины, но если я вставляю в TextView длинное слово, то android начинает глупые переносы слов на новую строку.
Например:
автоматизац
ия
Пример моего кода:
<TextView
android:id="@+id/textViewSize"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Автоматизация"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="2sp"
app:autoSizeMaxTextSize="60sp"
app:autoSizeStepGranularity="1sp"
android:breakStrategy="simple"
android:maxLines="10"
/>
Как я понял, если android видит, что ему можно разместить текст на 10 линий - android:maxLines="10", то он будет увеличивать масштаб текста до самого большого app:autoSizeMaxTextSize="60sp", и ему без разницы, что слово перенеслось на новую строку. Почему android не делает выбор в пользу размера слова, чтобы оно вошло в строку без переносов? Было бы удобно, если автомасштабирование чувствовало, что пора прекратить увеличивать размер текста, так как слово сейчас начнет переносится на новую строку и остановилось на размере например 50sp.
Параметр android:hyphenationFrequency="full" тоже не срабатывает. По сути данный параметр должен переносить слова на новую строку по слогам, но он не работает даже на английском тексте.
Моё TextView в разных случаях может показывать разное количество текста, от одного слова до абзаца, поэтому я указал android:maxLines="10"
Ответы (1 шт):
Нашел решение самостоятельно. Возможно для кого-то будет полезно.
@RequiresApi(api = Build.VERSION_CODES.O)
public class MainActivity extends AppCompatActivity {
private TextView textView;
float sizeWidthTextView;
int textMaxAutoSize = 50;
StringBuilder singleWordBuilder = new StringBuilder();
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textViewSize);
}
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
protected void onResume() {
super.onResume();
//Определяем ширину экрана в пикселях
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int widthDisplay = size.x;
textView.setTextSize(textMaxAutoSize);
//Определяем ширину TextView в пикселях
sizeWidthTextView = textView.getLayoutParams().width;
//Если ширина TextView задана как wrap_content либо match_parent, то будут возвращены значения -1 и -2
//нас это не устраивает и мы присваиваем переменной ширину всего дисплея.
if(sizeWidthTextView == -1 || sizeWidthTextView == -2) {
sizeWidthTextView = widthDisplay;
}
//Считаем длину каждого слова в пикселях и уменьшаем размер шрифта так, чтобы слово вмещалось в ширину TextView
for(int i = 0; i < textView.getText().length(); i++) {
if (textView.getText().charAt(i) != ' ') {
singleWordBuilder.append(textView.getText().charAt(i));
String singleWord = String.valueOf(singleWordBuilder);
float sizeWord = textView.getPaint().measureText(singleWord);
//Уменьшаем максимальный размер шрифта до тех пор пока слово не вместится в ширину TextView
while (sizeWidthTextView < sizeWord) {
textMaxAutoSize--;
textView.setTextSize(textMaxAutoSize);
sizeWord = textView.getPaint().measureText(singleWord);
}
} else {
singleWordBuilder.setLength(0);
}
}
}
}
<TextView
android:id="@+id/textViewSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:breakStrategy="simple"
android:maxLines="10"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="Авто авто Автоматизационный авто"/>