android 字符串对齐,android – 使用Spanable String对齐ImageSpan

我知道有很多相同类型的问题可供使用,我尝试了很多解决方案,但所有这些问题都达不到我的要求.

我的问题是我必须在包含Spanable字符串和Imagespan的文本之间添加动态行间距,但是当我添加行间距时,文本和图像的对齐会变形.

我已经尝试了Stackoverflow上几乎所有可用的解决方案,如this,this& this但是一切都在静脉中.

我附上了截图

>添加动态行间距之前的屏幕截图

B3cb7.png

2.添加动态行间距后的屏幕截图

014284f033b84a3b54b609f673026238.png

任何帮助将受到高度赞赏.提前致谢!

解决方法:

在onDraw方法中使用“y”查找文本的基线,然后将drawable与文本视图的基线对齐

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.FontMetricsInt fontMetricsInt) {

Drawable drawable = getDrawable();

Rect rect = drawable.getBounds();

if (fontMetricsInt != null) {

Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();

int fontHeight = fmPaint.descent - fmPaint.ascent;

int drHeight = rect.bottom - rect.top;

int centerY = fmPaint.ascent + fontHeight / 2;

fontMetricsInt.ascent = centerY - drHeight / 2;

fontMetricsInt.top = fontMetricsInt.ascent;

fontMetricsInt.bottom = centerY + drHeight / 2;

fontMetricsInt.descent = fontMetricsInt.bottom;

}

return rect.right;

}

/**

* see detail message in android.text.TextLine

*

* @param canvas the canvas, can be null if not rendering

* @param text the text to be draw

* @param start the text start position

* @param end the text end position

* @param x the edge of the replacement closest to the leading margin

* @param top the top of the line

* @param y the baseline

* @param bottom the bottom of the line

* @param paint the work paint

*/

@Override

public void draw(Canvas canvas, CharSequence text, int start, int end,

float x, int top, int y, int bottom, Paint paint) {

Drawable drawable = getDrawable();

canvas.save();

Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();

int fontHeight = fmPaint.descent - fmPaint.ascent;

int centerY = y + fmPaint.descent - fontHeight / 2;

int transY = centerY - (drawable.getBounds().bottom - drawable.getBounds().top) / 2;

canvas.translate(x, transY);

drawable.draw(canvas);

canvas.restore();

}

}

标签:android,android-layout

来源: https://codeday.me/bug/20190701/1349634.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值