帶行間距的TextView,讓文字和ImageSpan中的圖片居中顯示
阿新 • • 發佈:2019-01-30
上一篇部落格,講了怎麼讓匹配表情、連結、關鍵字等等。上篇部落格
http://blog.csdn.net/u014620028/article/details/52277102
但是,也留下了一個問題。就是行間距的問題。例如:
給展示行間距的textview,加上屬性:android:lineSpacingMultiplier="1.4"
,用之前的處理方法,當文字行數多的時候,會出現表情混亂的情況:
解決後的效果圖:
1、表情和文字基本一樣大
2、表情大於文字:
3、表情小於文字:
解決辦法:
1、重新ImageSpan的draw方法,重新計算、擺放表情等圖片
MyImageSpan:
package com.chen.customviewdemo.view;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;
public class MyImageSpan extends ImageSpan {
public MyImageSpan(Drawable drawable) {
super(drawable);
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end,
float x, int top, int y, int bottom, Paint paint) {
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
Drawable drawable = getDrawable();
int transY = (y + fm.descent + y + fm.ascent) / 2
- drawable.getBounds().bottom / 2;
canvas.save();
canvas.translate(x, transY);
drawable.draw(canvas);
canvas.restore();
}
}
2、在MyTextView中,設定Url前面回形針圖片的時候使用:
將上篇部落格中,對應的程式碼,改為:
try {
//“點選連結”前面的回形針圖片。大小可自己調整
Drawable drawable = context.getResources().getDrawable(R.mipmap.web_link);
drawable.setBounds(0, 0, 33, 33);
// ImageSpan imgSpan = new ImageSpan(drawable);
spannableString.setSpan(new MyImageSpan(drawable), urlStartOld + urlTemp.indexOf(CHEN.REPLACEMENT_STRING), urlStartOld + urlTemp.indexOf(CHEN.REPLACEMENT_STRING) + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {
//異常以後,就不加小圖片了
}
替換了spannableString.setSpan的第一個引數。其他不變
3、把ExpressionUtil下,dealSpannableString()中,對應程式碼替換為:
if (id != 0) {
Drawable drawable = context.getResources().getDrawable(id);
drawable.setBounds(0, 0, Utils.sp2px(context, emojiSize), Utils.sp2px(context, emojiSize));
// ImageSpan imgSpan = new ImageSpan(drawable);
int end = matcher.start() + key.length();
spannableString.setSpan(new MyImageSpan(drawable), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) { //如果整個字串還未驗證完,則繼續。。
dealSpannableString(context, spannableString, patten, end, emojiSize);
}
break;
}
注意spannableString.setSpan的第一個引數