gpt4 book ai didi

android - 围绕 ImageSpan 中心垂直对齐文本

转载 作者:IT王子 更新时间:2023-10-29 00:07:33 29 4
gpt4 key购买 nike

我有一个 ImageSpan一段文字里面。我注意到的是,周围的文本总是绘制在文本行的底部——更准确地说,文本行的大小随着图像的增长而增长,但文本的基线不会向上移动。当图像明显大于文本大小时,效果相当难看。

这是一个示例,大纲显示了 TextView 的边界: enter image description here

我试图让周围的文本相对于正在显示的图像垂直居中。这是相同的示例,其中蓝色文本显示了所需的位置:

enter image description here

以下是我受约束的约束:

  • 我不能使用复合绘图。图片必须能够在单词之间显示。
  • 文本可能是多行的,具体取决于内容。我无法控制。
  • 我的图片比周围的文字大,我无法缩小它们的大小。虽然上面的示例图片比实际图片大(用于演示当前行为),但实际图片仍然足够大,这个问题很明显。

我尝试在 TextView 上使用 android:gravity="center_vertical" 属性,但这没有任何效果。我相信这只是将文本 lines 垂直居中,但在文本行内,文本仍绘制在底部。

我目前的思路是创建一个自定义跨度,根据行高和当前文本大小移动文本的基线。这个跨度将包含整个文本,我必须计算与 ImageSpan 的交集,这样我也可以避免移动图像。这听起来相当令人生畏,我希望有人能提出另一种方法。

感谢您的任何帮助!

最佳答案

我的答案调整了第一个答案。其实上面两种方法我都试过了,我不认为它们真的是中心垂直的。如果它被放置在 ascentdescent 之间,而不是 topbottom 之间,它会使可绘制对象更加居中。至于第二个答案,它将drawable的中心与文本的基线对齐,而不是文本的中心。这是我的解决方案:

public class CenteredImageSpan extends ImageSpan {
private WeakReference<Drawable> mDrawableRef;

public CenteredImageSpan(Context context, final int drawableRes) {
super(context, drawableRes);
}

@Override
public int getSize(Paint paint, CharSequence text,
int start, int end,
Paint.FontMetricsInt fm) {
Drawable d = getCachedDrawable();
Rect rect = d.getBounds();

if (fm != null) {
Paint.FontMetricsInt pfm = paint.getFontMetricsInt();
// keep it the same as paint's fm
fm.ascent = pfm.ascent;
fm.descent = pfm.descent;
fm.top = pfm.top;
fm.bottom = pfm.bottom;
}

return rect.right;
}

@Override
public void draw(@NonNull Canvas canvas, CharSequence text,
int start, int end, float x,
int top, int y, int bottom, @NonNull Paint paint) {
Drawable b = getCachedDrawable();
canvas.save();

int drawableHeight = b.getIntrinsicHeight();
int fontAscent = paint.getFontMetricsInt().ascent;
int fontDescent = paint.getFontMetricsInt().descent;
int transY = bottom - b.getBounds().bottom + // align bottom to bottom
(drawableHeight - fontDescent + fontAscent) / 2; // align center to center

canvas.translate(x, transY);
b.draw(canvas);
canvas.restore();
}

// Redefined locally because it is a private member from DynamicDrawableSpan
private Drawable getCachedDrawable() {
WeakReference<Drawable> wr = mDrawableRef;
Drawable d = null;

if (wr != null)
d = wr.get();

if (d == null) {
d = getDrawable();
mDrawableRef = new WeakReference<>(d);
}

return d;
}
}

我还重写了 getSize 以保持drawable的FontMetrics与其他文本相同,否则父 View 将无法正确包装内容。

关于android - 围绕 ImageSpan 中心垂直对齐文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25628258/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com