android 将a11y改为大字体后,视图宽度不会变大
android view width is not bigger when a11y is changed to big font
我有一些代码可以测量 android 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 更改为最大的字体和最大的显示。
我在 UI 中看到文本被截断(省略)
但我的测量显示文本宽度(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();
从图像中我看到 myAccountView 扩展到圆形边缘。它的宽度跨越圆形边缘。但是文本在左半圈结束之后和右半圈开始之前开始和结束。所以应该考虑 myAccountView 的填充。在您的编辑中,您考虑了与 myAccountView 的父级无关的填充。
在测量 chipWidth 时应考虑填充。
int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();
似乎找到了解决办法,但我想根据我的研究提出几点。
int textViewWidth = textView.getMeasuredWidth();
returns 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 中减去来比较这些值是您的比较基础。
For Difference between the above two ways
您也可以尝试 textView.getLayout().getEllipsisStart(0)
以防您的 textView 是单行的,直接作为比较基础(而不是计算宽度)。它 return 文本被截断的索引 else returns 0.
我也建议你看看 Autosizing TextViews .
支持库 26.0 全面支持 Android 4.0(API 级别 14)及更高版本的自动调整 TextView 功能。
我有一些代码可以测量 android 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 更改为最大的字体和最大的显示。
我在 UI 中看到文本被截断(省略)
但我的测量显示文本宽度(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();
从图像中我看到 myAccountView 扩展到圆形边缘。它的宽度跨越圆形边缘。但是文本在左半圈结束之后和右半圈开始之前开始和结束。所以应该考虑 myAccountView 的填充。在您的编辑中,您考虑了与 myAccountView 的父级无关的填充。
在测量 chipWidth 时应考虑填充。
int chipWidth = myAccountView.getMeasuredWidth() - myAccountView.getPaddingLeft() - myAccountView.getPaddingRight();
似乎找到了解决办法,但我想根据我的研究提出几点。
int textViewWidth = textView.getMeasuredWidth();
returns 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 中减去来比较这些值是您的比较基础。
For Difference between the above two ways
您也可以尝试 textView.getLayout().getEllipsisStart(0)
以防您的 textView 是单行的,直接作为比较基础(而不是计算宽度)。它 return 文本被截断的索引 else returns 0.
我也建议你看看 Autosizing TextViews .
支持库 26.0 全面支持 Android 4.0(API 级别 14)及更高版本的自动调整 TextView 功能。