最近项目中需要使用到垂直居中的imagespan,在网上找到了相关的开源资源,但是发现现在网上的开源VerticalImageSpan都不能兼容lineSpaceExtra行高属性,一旦设置了lineSpaceExtra,那么ImageSpan位置就会发生偏移。于是我从TextView的源码入手,找到了一个能够兼容lineSpaceExtra的方法,其中最主要的思路就是利用了RelacementSpan的draw方法,参数“y”是每一行文本的baseLine,通过这个值,可以推算出ImageSpan居中时的位置,进而算出canvas的平移长度,达到真正的垂直居中。具体的源代码如下:
public class VerticalImageSpan extends ImageSpan {
public VerticalImageSpan(Drawable drawable) {
super(drawable);
}
/**
* update the text line height
*/
@Override
public int getSize(Paint paint, CharSequence text, int start, int end,
Paint