Android ImageSpan的表情文字居中对齐
程序员文章站
2022-05-25 21:28:50
...
复制下面的工具类 MyImageSpan:
public class MyImageSpan extends ImageSpan {
public MyImageSpan(Drawable arg1) {
super(arg1);
}
public int getSize(Paint paint, CharSequence text, int start, int end,
Paint.FontMetricsInt fm) {
Drawable d = getDrawable();
Rect rect = d.getBounds();
if (fm != null) {
Paint.FontMetricsInt fmPaint=paint.getFontMetricsInt();
int fontHeight = fmPaint.bottom - fmPaint.top;
int drHeight=rect.bottom-rect.top;
int top= drHeight/2 - fontHeight/4;
int bottom=drHeight/2 + fontHeight/4;
fm.ascent=-bottom;
fm.top=-bottom;
fm.bottom=top;
fm.descent=top;
}
return rect.right;
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end,
float x, int top, int y, int bottom, Paint paint) {
Drawable b = getDrawable();
canvas.save();
int transY = 0;
transY = ((bottom-top) - b.getBounds().bottom)/2+top;
canvas.translate(x, transY);
b.draw(canvas);
canvas.restore();
}
}
在代码中设置即可:
Spannable spannable = et_context.getText().insert(start, faceCode);
Drawable drawable = context.getResources().getDrawable(faceId);
drawable.setBounds(0, 0, px, px);
spannable.setSpan(new MyImageSpan(drawable), start, start + faceCode.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
推荐阅读