2014-01-28 3 views
4

У меня есть TextView, который использует атрибут android:lineSpacingMultiplier, чтобы увеличить расстояние между строками, которое отлично работает, за исключением тех случаев, когда я добавляю текст ImageSpan к тексту.ImageSpan выравнивание в TextView

Это приводит к выравниванию изображения в нижней части пространства между строками, а не базовой линией текста (как указано при его создании).

Я попытался использовать атрибут android:lineSpacingExtra, с некоторым успехом изображение по-прежнему было размещено ниже, чем должно быть, но не так много. Есть ли альтернативный способ увеличения пространства между строками, не испортив вертикальное выравнивание ImageSpan?

ответ

3

Когда вы создаете ImageSpan, вы можете указать вертикальное выравнивание, одно из ImageSpan.ALIGN_BOTTOM или ImageSpan.ALIGN_BASELINE. Я считаю, что ImageSpan по умолчанию использует ALIGN_BOTTOM, поэтому попробуйте конструктор, который позволяет указать ALIGN_BASELINE.

1

Я столкнулся с той же проблемой, межстрочный изменил базовую линию, так что сносит изображения при вводе текста ... вы должны реализовать пользовательский промежуток изображения, изменяя его метод рисования:

public class CustomImageSpan extends ImageSpan{  
    public static final int ALIGN_TOP = 2; 
    public static final int ALIGN_CUSTOM = 3; 
    @Override 
    public void draw(Canvas canvas, CharSequence text, 
        int start, int end, float x, 
        int top, int y, int bottom, Paint paint) { 
     Drawable b = getCachedDrawable(); 
     canvas.save(); 

     int transY = bottom - b.getBounds().bottom; 
     if (mVerticalAlignment == ALIGN_BASELINE) { 
      transY -= paint.getFontMetricsInt().descent; 
     } else if (mVerticalAlignment == ALIGN_TOP) { 
      transY += paint.getFontMetricsInt().ascent; 
     } 

     canvas.translate(x, transY); 
     b.draw(canvas); 
     canvas.restore(); 
    } 
     private Drawable getCachedDrawable() { 
      WeakReference<Drawable> wr = mDrawableRef; 
      Drawable d = null; 

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

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

      return d; 
     } 

     private WeakReference<Drawable> mDrawableRef; 
} 
Смежные вопросы