首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android中图像的文本环绕

android中图像的文本环绕
EN

Stack Overflow用户
提问于 2013-06-26 15:21:14
回答 1查看 7.8K关注 0票数 8

我使用列表视图来显示我想要显示的图像和文本,就像上面的图像一样,有人能建议我如何在没有webview的情况下围绕图像包装文本吗?我使用了以下代码:

代码语言:javascript
复制
     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);

班级

代码语言:javascript
复制
 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;
    }
};

通过使用此代码,iam获得下面的图像,请建议如何获得第一个意味着正确地将文本环绕在图像周围,而不是更多的空格

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-21 23:07:49

较旧的帖子,但由于没有公认的答案,我刚刚在我的应用程序中找到了相同问题的解决方案,我将发布一个解决方案。

我发现不带任何换行符的文本效果很好。带有换行符的文本,它将文本分成两部分,换行前的部分在图像的右侧结束,换行后的部分已经在图像下面的下一行开始,这也很好用。

因此,我要做的是将包装TextView的LayoutParams的左边距设置为所需的缩进,并将文本设置为TextView。然后添加OnGlobalLayoutListener,并在onGlobalLayout回调中计算图像右侧最后一行的最后一个字符的位置

代码语言:javascript
复制
//lines - number of lines to be affected by the leadingMargin    
int charCount = textView.getLayout().getLineEnd(Math.min(lines - 1, textView.getLayout().getLineCount() - 1));

如果文本的行数不超过左边距应有的行数(或者如果最后一个字符已经换行),我只需在文本的整个长度上设置LeadingMarginSpan2。

代码语言:javascript
复制
// 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);
}

如果文本较长,我将其分成两部分(第一部分在charCount位置结束),在它们之间插入换行符,合并它们,并仅在第一部分设置LeadingMarginSpan2。

代码语言:javascript
复制
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));
}

最后,不要忘记删除文本视图的LayoutParams的左边距。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17313898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档