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

标签 android

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

            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/

相关文章:

android - 如何将预建的 Android SQLite 数据库移动到内存?

android - 回收 View 与 ScrollView 中的线性布局?

java - 基于 MATLAB 的 Java 程序

android - Getstream 聊天在 Activity 置于后台然后返回前台后初始化

android - 有没有办法覆盖Android中 View 的动画辅助功能设置

android - 渲染一个正方形

Android,我怎样才能将完整的应用程序安装在SD卡上

android - Exoplayer播放m3u8文件Android

android getLine1Number() 返回空字符串

android - 我的 Android 应用出现 "Trouble Processing"错误