使ImageSpan适合TextView行高

时间:2013-10-24 13:22:53

标签: android android-edittext textview drawable

我需要在textview中放置一些图标,但它们不符合行高(请看箭头):

screenshoot

我试过了:

spannable.setSpan(new ImageSpan(context, entry.getValue(), ImageSpan.ALIGN_BOTTOM), Matcher.start(), matcher.end(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
t.setText(spannable, BufferType.SPANNABLE);

和此:

    Drawable myIcon = c.getResources().getDrawable(R.drawable.myicon);
    myIcon.setBounds(0, 0, myIcon.getIntrinsicWidth(), myIcon.getIntrinsicHeight());
    spannable.setSpan(new ImageSpan(myIcon, ImageSpan.ALIGN_BASELINE), matcher.start(), matcher.end(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
t.setText(spannable, BufferType.SPANNABLE);

并且在两种情况下我都有相同的结果。

我将图标保存在/ res / drawable文件夹中,其大小为75x75px。 我试图降低图像分辨率,但它们看起来很模糊

2 个答案:

答案 0 :(得分:31)

您需要将图像的边界设置为TextView的线高。例如:

myIcon.setBounds(0, 0, t.getLineHeight(),t.getLineHeight());

这当然假设你想要一个方形图像。如果不是方形,则需要根据线高度手动确定宽度值。

答案 1 :(得分:0)

要获得包含在textview drawable中的正确高度,您应该设置它们适当的边界。但首先,我们必须正确计算它们。特别是它的高度。

经过一些实验后,我意识到来自FontMetricsInt类的Paint字段非常有用。

Paint textPaint = new Paint();
//obviously, we have to set textSize into Paint object
textPaint.setTextSize(textSize);
FontMetricsInt fontMetrics = textPaint.getFontMetricsInt();
setBounds(
        0,
        fontMetrics.ascent,
        widthForDrawable,
        fontMetrics.bottom
);

因此,我们的图片顶部使用ascentFontMetricsInt和底部 - bottom值进行对齐。