
我正在使用列表视图来显示我想要像上面的图像一样显示的图像和文本,任何人都可以建议我如何用webview包装图像周围的文本.我使用以下代码:
Drawable dIcon = getResources().getDrawable(R.drawable.video_icon);
int leftMargin = dIcon.getIntrinsicWidth() + 10;
ImageView icon = (ImageView) findViewById(R.id.icon);
icon.setBackgroundDrawable(dIcon);
SpannableString ss = new SpannableString(text);
ss.setSpan(new MyLeadingMarginSpan2(3, leftMargin), 0, ss.length(), 0);
TextView messageView = (TextView) findViewById(R.id.message_view);
messageView.setText(ss);
Run Code Online (Sandbox Code Playgroud)
类
class MyLeadingMarginSpan2 implements LeadingMarginSpan2 {
private int margin;
private int lines;
MyLeadingMarginSpan2(int lines, int margin) {
this.margin = margin;
this.lines = lines;
}
@Override
public int getLeadingMargin(boolean first) {
if (first) {
return margin;
} else {
return 0;
}
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
int top, int baseline, int bottom, CharSequence text,
int start, int end, boolean first, Layout layout) {}
@Override
public int getLeadingMarginLineCount() {
return lines;
}
};
Run Code Online (Sandbox Code Playgroud)
通过使用此代码,我得到下面的图像请建议如何获得第一意味着正确包装图像周围的文本没有更多的空白空间

较旧的帖子,但由于没有公认的答案,并且我刚刚在我的应用程序中找到了相同问题的解决方案,因此我将发布一个解决方案。
我发现没有任何换行符的文本效果很好。带有换行符的文本将文本分成两部分,换行符之前的部分在图像右侧结束,换行符之后的部分已经在图像下方的下一行开始,这也很有效。
所以我要做的就是将包装 TextView 的 LayoutParams 的左边距设置为所需的缩进,并将文本设置到 TextView 中。然后我添加 OnGlobalLayoutListener,并在 onGlobalLayout 回调中计算图像右侧最后一行的最后一个字符的位置
//lines - number of lines to be affected by the leadingMargin
int charCount = textView.getLayout().getLineEnd(Math.min(lines - 1, textView.getLayout().getLineCount() - 1));
Run Code Online (Sandbox Code Playgroud)
如果文本的行数不超过应具有左边距的行数(或者如果最后一个字符已经是换行符),我只需在文本的整个长度上设置leadingMarginSpan2。
// s - original Spannable containing the whole text
if (charCount >= s.length() || charCount <= 0 || s.charAt(charCount - 1) == '\n') {
s.setSpan(new MyLeadingMarginSpan(lines, w), 0, charCount, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(s);
}
Run Code Online (Sandbox Code Playgroud)
如果文本较长,我将其分成两部分(第一部分在 charCount 位置结束),在它们之间插入换行符,合并它们并仅在第一部分上设置leadingMarginSpan2。
else {
Spannable s1 = new SpannableStringBuilder(s, 0, charCount);
s1.setSpan(new MyLeadingMarginSpan(lines, w), 0, charCount, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Spannable s2 = new SpannableStringBuilder(System.getProperty("line.separator"));
Spannable s3 = new SpannableStringBuilder(s, charCount, s.length());
textView.setText(TextUtils.concat(s1, s2, s3));
}
Run Code Online (Sandbox Code Playgroud)
最后,不要忘记删除 TextView 的 LayoutParams 的左边距。
| 归档时间: |
|
| 查看次数: |
6392 次 |
| 最近记录: |