多行阿拉伯文本的 StaticLayout 高度不准确
StaticLayout inaccurate height for multi-line Arabic text
我正在尝试以编程方式计算文本所需的高度,因此我使用的是 StaticLayout。
我正在使用其绘制对象对标签 (TextView) 进行试验,以确保计算出的高度与 Android 呈现的 TextView 的高度相同。
它适用于阿拉伯语和英语的单行文本,也适用于英语的多行文本,但阿拉伯语高度关闭,它总是比 Android 呈现的短。
顶部高度~80是TextView的高度,而后者~75是需要计算的高度。
因为它在英语中运行良好,我想我可能需要设置一些其他的 属性 或其他东西,但我不知道是什么。
以下是我的代码,因为我使用的是 Xamarin,所以它在 C# 中,但对于 Android 开发人员来说应该很清楚。
Control
是 TextView。
double getTextHeight(string str, double widthConstraint)
{
if (Control == null || String.IsNullOrWhiteSpace(str))
return 0;
var builder = StaticLayout.Builder.Obtain(str, 0, str.Length, Control.Paint, (int)widthConstraint);
builder.SetAlignment(Control.Layout.GetAlignment());
builder.SetIncludePad(true);
builder.SetLineSpacing(Control.Layout.SpacingAdd, Control.Layout.SpacingMultiplier);
builder.SetBreakStrategy(Control.BreakStrategy);
builder.SetJustificationMode(Control.JustificationMode);
builder.SetHyphenationFrequency(Control.HyphenationFrequency);
var staticLayout = builder.Build();
return staticLayout.Height;
}
这是我遗漏的代码,它工作起来很有魅力:)
builder.SetUseLineSpacingFromFallbacks(true);
我正在尝试以编程方式计算文本所需的高度,因此我使用的是 StaticLayout。
我正在使用其绘制对象对标签 (TextView) 进行试验,以确保计算出的高度与 Android 呈现的 TextView 的高度相同。
它适用于阿拉伯语和英语的单行文本,也适用于英语的多行文本,但阿拉伯语高度关闭,它总是比 Android 呈现的短。
顶部高度~80是TextView的高度,而后者~75是需要计算的高度。
因为它在英语中运行良好,我想我可能需要设置一些其他的 属性 或其他东西,但我不知道是什么。
以下是我的代码,因为我使用的是 Xamarin,所以它在 C# 中,但对于 Android 开发人员来说应该很清楚。
Control
是 TextView。
double getTextHeight(string str, double widthConstraint)
{
if (Control == null || String.IsNullOrWhiteSpace(str))
return 0;
var builder = StaticLayout.Builder.Obtain(str, 0, str.Length, Control.Paint, (int)widthConstraint);
builder.SetAlignment(Control.Layout.GetAlignment());
builder.SetIncludePad(true);
builder.SetLineSpacing(Control.Layout.SpacingAdd, Control.Layout.SpacingMultiplier);
builder.SetBreakStrategy(Control.BreakStrategy);
builder.SetJustificationMode(Control.JustificationMode);
builder.SetHyphenationFrequency(Control.HyphenationFrequency);
var staticLayout = builder.Build();
return staticLayout.Height;
}
这是我遗漏的代码,它工作起来很有魅力:)
builder.SetUseLineSpacingFromFallbacks(true);