Подтвердить что ты не робот

Fit ImageSpan для высоты строки 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. Я попытался снизить разрешение изображения, но они выглядят размытыми.

4b9b3361

Ответ 1

Вам нужно установить границы изображения на высоту строки TextView. Например:

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

Это, конечно, предполагает, что вы хотите квадратное изображение. Если не квадрат, вам нужно вручную определить, какое значение ширины должно быть основано на высоте линии.

Ответ 2

Чтобы достичь правильной высоты, включенной в чертежи textview, вы должны установить соответствующие границы. Но, во-первых, мы должны правильно их вычислить. Особенно его высота.

После некоторых экспериментов я понял, что поле 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
);

Итак, верхняя часть нашего изображения выровнена с использованием значения ascent FontMetricsInt, а нижняя - с bottom значением.