我有一些代码可以测量 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();