gpt4 book ai didi

android - 椭圆化 TextView 中 SpannableString 的各行

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:54:30 25 4
gpt4 key购买 nike

我有一个 TextView 存储一个两行长的地址。街道走在一线,大胆。城市和州走在第二条线上,并不大胆。如果该行上的单个文本超出,我希望每行的末尾都省略。我正在使用 SpannableString 来存储地址,因为我希望街道地址为粗体,而城市和州不为粗体。

有没有一种方法可以在不为每一行使用两个 TextViews 的情况下做到这一点?

示例输出:

例如:
123812 华盛顿州...
Schenectady New Yor...

例如:
2792 Dantzler Boulev...
查尔斯顿 SC,29406

例如:
大街 3 号
佐治亚州亚特兰大

最佳答案

我遇到了同样的问题并通过创建一个 EllipsizeLineSpan 类解决了它。您可以用它包裹要省略的每一行。

用它标记一个可生成的字符串的例子:

SpannableStringBuilder textspan = new SpannableStringBuilder("#1.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"+
"Protect from ellipsizing #2.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"+
"#3.Lorem ipsum dolor sit amet, consectetur adipisicing elit\n"+
"#4.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n");

// find ellipsizable text (from '#' to newline)
Pattern pattern = Pattern.compile("#.*\\n", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(textspan);
while(matcher.find()) {
textspan.setSpan(new EllipsizeLineSpan(), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

椭圆大小线跨度:

public class EllipsizeLineSpan extends ReplacementSpan implements LineBackgroundSpan {
int layoutLeft = 0;
int layoutRight = 0;

public EllipsizeLineSpan () {
}

@Override
public void drawBackground (Canvas c, Paint p,
int left, int right,
int top, int baseline, int bottom,
CharSequence text, int start, int end,
int lnum) {
Rect clipRect = new Rect();
c.getClipBounds(clipRect);
layoutLeft = clipRect.left;
layoutRight = clipRect.right;
}

@Override
public int getSize (Paint paint, CharSequence text, int start, int end,
Paint.FontMetricsInt fm) {
return layoutRight - layoutLeft;
}

@Override
public void draw (Canvas canvas, CharSequence text, int start, int end,
float x, int top, int y, int bottom, Paint paint) {
float textWidth = paint.measureText(text, start, end);

if (x + (int) Math.ceil(textWidth) < layoutRight) { //text fits
canvas.drawText(text, start, end, x, y, paint);
} else {
float ellipsiswid = paint.measureText("\u2026");
// move 'end' to the ellipsis point
end = start + paint.breakText(text, start, end, true, layoutRight - x - ellipsiswid, null);
canvas.drawText(text, start, end, x, y, paint);
canvas.drawText("\u2026", x + paint.measureText(text, start, end), y, paint);

}

}


}

关于android - 椭圆化 TextView 中 SpannableString 的各行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com