eri*_*rin 5 android ellipsis textview spannablestring
我有一个TextView存储长度为两行的地址.街道在第一行,并且是大胆的.城市和州都走在第二线,并不是大胆的.如果该行上的单个文本运行,我希望每行的结尾都是椭圆形的.我使用a SpannableString来存储地址,因为我希望街道地址是粗体,而城市和州不是粗体.
有没有一种方法可以做到这一点,而不是完全黑客而不使用TextViews每行两个?
示例输出:
例如:
123812 Washington A ...
Schenectady New Yor ...
例:
2792 Dantzler Boulev ......
Charleston SC,29406
例如:
3大街
亚特兰大GA
dan*_*mit 19
我遇到了同样的问题,并通过创建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);
}
Run Code Online (Sandbox Code Playgroud)
EllipsizeLineSpan:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Nul*_*ter -4
TextView尝试在布局中设置椭圆大小,例如:
android:ellipsize="end"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2454 次 |
| 最近记录: |