Ширина представления Android не больше, когда a11y изменяется на большой шрифт
У меня есть код, который измеряет ширину andView textView и текст для отображения в нем.
final ViewTreeObserver[] viewTreeObserver = {myAccountView.getViewTreeObserver()};
viewTreeObserver[0].addOnPreDrawListener(
new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
myAccountView.setText(R.string.og_my_account_desc_long_length);
int chipWidth = myAccountView.getMeasuredWidth();
if (chipWidth > 0) {
setChipTextWithCorrectLength(chipWidth);
viewTreeObserver[0] = myAccountView.getViewTreeObserver();
if (viewTreeObserver[0].isAlive()) {
viewTreeObserver[0].removeOnPreDrawListener(this);
}
}
return true;
}
});
}
private void setChipTextWithCorrectLength(int chipWidth) {
String desc =
setChipTextWithCorrectLength(
getContext().getString(R.string.og_my_account_desc_long_length),
getContext().getString(R.string.og_my_account_desc_meduim_length),
getContext().getString(R.string.og_my_account_desc_short_length),
chipWidth);
myAccountView.setText(desc);
}
@VisibleForTesting
String setChipTextWithCorrectLength(
String longDesc, String mediumDesc, String shortDesc, int clipWidth) {
if (textWidthPixels(longDesc) > clipWidth) {
if (textWidthPixels(mediumDesc) > clipWidth) {
return shortDesc;
} else {
return mediumDesc;
}
}
return longDesc;
}
public float textWidthPixels(String text) {
TextPaint textPaint = myAccountView.getPaint();
return textPaint.measureText(text);
}
Я изменил свое устройство a11y на самый большой шрифт и самый большой дисплей.
Я вижу в пользовательском интерфейсе текст обрезается (многоточие)
но мои измерения показывают, что ширина текста (503 пикселей) меньше ширины просмотра текста (587 пикселей).
как это может быть?
как я должен измерить их по-другому, чтобы мой код также указывал, что ширина текста больше ширины текстового представления?
Редактировать:
Я пытался добавить отступы, но это не изменилось. изменение на a11y обрезало длинный текст вместо выбора более короткого текста.
public float textWidthPixels(String text) {
TextPaint textPaint = myAccountView.getPaint();
View parent = (View) myAccountView.getParent();
float width = textPaint.measureText(text);
int paddingLeft = parent.getPaddingLeft();
int paddingRight = parent.getPaddingRight();
return width - (paddingLeft + paddingRight);
}
Редактировать:
я пытался вычислить chipWidth, учитывая его отступы, но все же textSize делает текст усеченным, пока его размер в коде становится короче размера представления
int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();
2 ответа
Кажется, что решение найдено, но я хотел бы высказать несколько соображений, основанных на моих исследованиях.
int textViewWidth = textView.getMeasuredWidth();
возвращает ширину textView, включая любые отступы.
Для прилагаемого текста:
можно использовать measureText():
TextPaint paint = textView.getPaint(); int textWidth = (int)paint.measureText(textView.getText().toString());
С помощью
getTextBounds()
TextPaint paint = textView.getPaint(); Rect bounds = new Rect(); paint.getTextBounds(textView.getText().toString(),0,textView.getText().toString().length(),bounds); int textWidth = bounds.width();
Сравнение этих значений путем добавления значений отступов к textWidth или вычитания из textViewWidth является основой для сравнения.
Для разницы между вышеупомянутыми двумя способами
Вы также можете попробовать textView.getLayout().getEllipsisStart(0)
в случае, если ваш textView является однострочным непосредственно как база сравнения (а не вычисляет ширину) . Он возвращает индекс, из которого текст усекается, иначе возвращает 0.
Я также рекомендовал бы вам видеть Autosizing TextViews.
Библиотека поддержки 26.0 обеспечивает полную поддержку функции автоматического изменения размера TextView для Android 4.0 (уровень API 14) и выше.
Из изображения я вижу, что myAccountView расширяется до закругленных краев. Его ширина простирается до закругленных краев. Но текст начинается и заканчивается после конца левого полукруга и до начала правого полукруга. Поэтому следует учитывать заполнение myAccountView. При редактировании вы рассматривали заполнение родительского элемента myAccountView, который не имеет отношения к делу.
При измерении ширины чипа следует учитывать заполнение.
int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();