700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android 字符串对齐 android – 使用Spanable String对齐ImageSpan

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

时间:2020-01-19 15:32:59

相关推荐

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

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

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

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

我附上了截图

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

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

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

解决方法:

在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/0701/1349634.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。