如何围绕 ImageView 对齐 TextView?

Posted

技术标签:

【中文标题】如何围绕 ImageView 对齐 TextView?【英文标题】:How to align TextView around an ImageView? 【发布时间】:2012-07-14 16:50:14 【问题描述】:

我正在尝试围绕 ImageView 对齐 TextView。我正在使用以下代码:

 private void createSpannableText()
        TextView myTextView = (TextView) findViewById(R.id.textView);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        builder.append(this.getText(R.string.loren__ipsum__max));
        int lengthOfPart1 = builder.length();
        builder.append(" ");
        builder.append(this.getText(R.string.lorem__ipsum));
        Drawable d = getResources().getDrawable(R.drawable.myImage);
        d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); // <---- Very important otherwise your image won't appear
        ImageSpan myImage = new ImageSpan(d);
        builder.setSpan(myImage, 0, lengthOfPart1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        myTextView.setText(builder);
    

但无法得到确切的结果。我该怎么办?在这种情况下我需要使用 SpannableStringBuilder 还是有其他方法。请帮忙。我用了这个帖子-http://majaxandroidtips.blogspot.in/2009/06/how-to-have-few-layout-elements-wrap_17.html 得到解决方案。

P.S.:我还想要 ImageView 周围的 6dp 边距

【问题讨论】:

提问的好方法:) @Debopam 你有没有为放置在右侧的图像修复下面的代码? 【参考方案1】:

您可以使用 API 8 中提供的android.text.style.LeadingMarginSpan.LeadingMarginSpan2 接口来实现这一点。这里是article,虽然不是英文,请使用您的浏览器进行翻译。另外你可以直接从here下载例子的源代码。

你的布局:

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:padding="5dp">
    <TextView
        android:textSize="18.0sp"
        android:id="@+id/message_view"
        android:layout_
        android:layout_
        android:text="@string/text" />
    <ImageView
        android:src="@drawable/icon"
        android:layout_
        android:layout_
        android:id="@+id/icon" />
</RelativeLayout>

Helper 类实现LeadingMarginSpan.LeadingMarginSpan2

class MyLeadingMarginSpan2 implements LeadingMarginSpan.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) 
            /*
             * Данный отступ будет применен к количеству строк
             * возвращаемых getLeadingMarginLineCount()
             */
            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) 

    /*
     * Возвращает количество строк, к которым должен быть 
     * применен отступ возвращаемый методом getLeadingMargin(true)
     * Замечание:
     * Отступ применяется только к N строкам первого параграфа.
     */
    @Override
    public int getLeadingMarginLineCount() 
        return lines;
    
;

您的活动代码:

 @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String text = getString(R.string.text);

        // Получаем иконку и ее ширину
        Drawable dIcon = getResources().getDrawable(R.drawable.icon);
        int leftMargin = dIcon.getIntrinsicWidth() + 10;

        // Устанавливаем иконку в R.id.icon
        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);
    

最后是演示结果:

【讨论】:

我已经实现了。但是 ImageView 在文本后面而不是在它的实际位置。 好的。我知道了。但是有没有可能确定没有。根据图像的高度计算行数。我的意思是,线条将由图像的高度决定。使用 dIcon.getIntrinsicHeight() 是不可能的,因为它返回的值大于我的值。行数。 @Debopam 我想你可以通过使用textview的图像高度和文本行高来获取数字,你可以看到漩涡的答案***.com/questions/2248759/… @Debopam 他使用了 int lines = (int)Math.round(height / textLineHeight); 为什么不使用 ImageSpan?

以上是关于如何围绕 ImageView 对齐 TextView?的主要内容,如果未能解决你的问题,请参考以下文章

android:如何在imageview的水平中心对齐图像?

如何在android中根据上面的imageview对齐textview

将 ImageView 与 EditText 水平对齐

在 WebView 内对齐 ImageView

如果另一个项目不存在,Xcode会将项目对齐在中心

当只有一些有 imageView 时,对齐 UITableViewCells 的正确方法是啥?