ImageSpan被剪切/错误对齐

时间:2010-07-15 06:56:32

标签: android

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

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

结果(构建器)被设置为TextView的文本。如果跨度被文本包围,即当开始>时,它可以正常工作。 0和结束<长度为1,但如果周围没有文字,图像会被切断(向上移动)。我该如何解决这个问题?

非常感谢。

5 个答案:

答案 0 :(得分:7)

继续使用您的解决方案后,我使用的是DynamicDrawableSpan我自定义的ImageSpan代替draw()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(); } } 方法(从DynamicDrawableSpan复制并修改)确保在与基线对齐之前有文本。

{{1}}

答案 1 :(得分:4)

我也遇到了这个问题,找不到合适的解决方案。我使用的解决方法如下:

if(message.length() == 1){
//This is a hack to get past an android bug that misaligns ImageSpan's when they are all alone.
    message += " ";
}
builder = new SpannableStringBuilder(message);

答案 2 :(得分:3)

好吧,由于没有任何建议,我将在此期间使用以下解决方案:如果没有文本 - 使用ALIGN_BOTTOM标志,否则使用ALIGN_BASELINE ...

答案 3 :(得分:0)

尝试设置drawable的边界。例如:

        BitmapDrawable bmd = new BitmapDrawable(bm);
        int width = bmd.getIntrinsicWidth();
        int height = bmd.getIntrinsicHeight();
        bmd.setBounds(
                0,
                0,
                (int)width,
                (int)height);

        ImageSpan img = new ImageSpan(bmd);
        SpannableString spannableString = new SpannableString(
          someString);
        spannableString.setSpan(
          img, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

答案 4 :(得分:0)

对于我来说,在将其传递给ImageSpan之前,我还没有设置drawable的边界。

您可以设置&#34;内在界限&#34;通过做类似的事情来抽象:

Drawable drawable = // what you use to create/get your drawable
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan span = new ImageSpan(drawable);