一思喊、前言
在開發(fā)中經常會遇到文字插入小圖標,就像下面“圖1”這種邓嘹,上榜和預售是兩個小圖片,然后因為文字需要換行险胰,不能用ImageView+TextView去實現汹押,我們就只能用一個TextView,在里面加入圖片
二起便、具體實現
具體代碼如下棚贾、需要注意的是CenterImageSpan類,這個是自定義的榆综,如果用原生的ImageSpan妙痹,圖片是不能和文字居中的,要么偏上奖年,要么偏下细诸。
private fun setDrawableText(context: Context, tv: TextView, str: String?, drawables: IntArray) {
tv.text = ""
if (drawables.isNotEmpty()){
for(i in drawables.indices){
val drawable = drawables[i]
val d = ContextCompat.getDrawable(context,drawable)
d?.setBounds(0,0,d.minimumWidth,d.minimumHeight)
val span = d?.let { CenterImageSpan(it) }
val spanStr = SpannableString("custom$i")
spanStr.setSpan(span, 0, spanStr.length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
tv.append(spanStr)
tv.append(" ")
}
}
tv.append("$str")
}
CenterImageSpan類
public class CenterImageSpan extends ImageSpan {
public CenterImageSpan(@NonNull Drawable drawable) {
super(drawable);
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
Drawable b = getDrawable();
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int transY = (y + fm.descent + y + fm.ascent)/ 2- b.getBounds().bottom/2;
canvas.save();
canvas.translate(x,transY);
b.draw(canvas);
canvas.restore();
}
}
三、核心代碼講解
我們這里主要是用SpannableString這個類實現陋守,這個類可以實現很多特殊TextView的樣式震贵,具體看注釋代碼
//圖片資源轉drawable, drawable參數例子 R.drawable.main_tg_yushou
val d = ContextCompat.getDrawable(context,drawable)
//設置圖片大小
d?.setBounds(0,0,d.minimumWidth,d.minimumHeight)
//生成ImageSapn
val span = d?.let { CenterImageSpan(it) }
//這里定義一個SpannableString,里面內容不重要水评,可自己隨便定義猩系。
//注意:這里如果有復制功能,那這個圖片的內容就是這里面的字符串
val spanStr = SpannableString("custom$i")
//把圖片設置進Span中
spanStr.setSpan(span, 0, spanStr.length,Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
//追加到TextView中
tv.append(spanStr)