android - 在android中环绕图像的文字

标签 android

enter image description here

我正在使用 ListView 来显示我想显示的图像和文本,如上图所示,任何人都可以建议我如何在没有 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);

 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;
    }
};

通过使用这段代码,我得到下面的图像,请建议如何首先意味着在图像周围正确环绕文本,没有更多的空格

wrap text around image

最佳答案

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

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

所以我所做的是将环绕 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));

如果文本的行数不超过应该有左边距的行数(或者如果最后一个字符已经是换行符),我只需在整个文本长度上设置 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);
}

如果文本较长,我将其分成两部分(第一部分在 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));
}

最后,不要忘记移除 TextView 的 LayoutParams 的左边距。

关于android - 在android中环绕图像的文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17313898/

相关文章:

android - 将 drawableLeft 和 drawableRight 的高度约束为 TextView 的高度

android - 计算各大洲服务器的下载速度/丢包/抖动/延迟值 (Android)

javascript - 将架构协议(protocol)更改为 http ://in WebView Android

android - 库模块依赖与 App 模块依赖

android - Android 中的按钮和背景大小/分辨率

java - AWS Android 聊天应用程序

android - 从 Activity 中删除邮件图标?

android - 如何写血压google fit

android - 以逗号作为小数点分隔符的 Masked EditText

android - 使用RelativeLayout构建像ui这样的网格时出现问题