gpt4 book ai didi

android - ImageSpan 被切断/未正确对齐

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:46 25 4
gpt4 key购买 nike

我正在使用以下代码实现表情符号:

            builder.setSpan(new ImageSpan(mContext, resId, ImageSpan.ALIGN_BASELINE),
start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE );

结果(构建器)被设置为 TextView 的文本。如果跨度被文本包围,即当开始 > 0 且结束 < 长度 - 1 时,它工作得很好,但如果周围没有文本,图像将被切断(向上移动)。我该如何解决?

非常感谢。

最佳答案

按照您的解决方案,这是我的自定义 DynamicDrawableSpan,我用它代替 ImageSpandraw() 方法(从 DynamicDrawableSpan 复制并修改)确保在与基线对齐之前有文本。

class StickerSpan extends DynamicDrawableSpan {
Drawable mDrawable;

public StickerSpan(Context context, Bitmap bitmap) {
super(DynamicDrawableSpan.ALIGN_BASELINE);
setBitmap(context, bitmap);
}

public void setBitmap(Context context, Bitmap bitmap) {
mDrawable = new BitmapDrawable(context.getResources(), bitmap);
int width = mDrawable.getIntrinsicWidth();
int height = mDrawable.getIntrinsicHeight();
mDrawable.setBounds(0, 0, width > 0 ? width : 0, height > 0 ? height : 0);
}

@Override
public Drawable getDrawable() {
return mDrawable;
}

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

int transY = bottom - b.getBounds().bottom;
if (mVerticalAlignment == ALIGN_BASELINE) {
int textLength = text.length();
for (int i = 0; i < textLength; i++) {
if (Character.isLetterOrDigit(text.charAt(i))) {
transY -= paint.getFontMetricsInt().descent;
break;
}
}
}

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

关于android - ImageSpan 被切断/未正确对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3253148/

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