web-dev-qa-db-ja.com

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です。画像の解像度を下げようとしましたが、ぼやけて見えます

25
filippo

画像の境界をTextViewの行の高さに設定する必要があります。例えば:

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

もちろん、これは正方形の画像が必要であることを前提としています。正方形でない場合は、線の高さに基づいて幅の値を手動で決定する必要があります。

32
Jay Soyer

テキストビューのドローアブルに含まれる高さを正しくするには、適切な境界を設定する必要があります。しかし、最初に、それらを正しく計算する必要があります。特にその高さ。

いくつかの実験の結果、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値を使用して配置されます。

0
Andrii Panasiuk