androidtextviewspannablestringspannablestringbuilder

How quotes align-top with text in TextView?


I have a spannnable string and that spannable sting containg images and string and but When i Display that string on textview that images align with base line of textview i want to display ALIGN_TOP with that string I am stuck on this please help me to sort out.

Here is my code

        String text2 = "  Lorem Ipsum is simply dummy text of the printing   and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.  ";

        Spannable spannable = new SpannableString(text2);

        spannable.setSpan(new ImageSpan(mActivity, R.mipmap.start_quote_green), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        spannable.setSpan(new ImageSpan(mActivity, R.mipmap.end_quote_green), text2.length()-1, text2.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

        inspirationalActivityInspirationalTextTv.setText(spannable, TextView.BufferType.SPANNABLE);

Output
result

Required
required


Solution

  • Here is Answer

            String text2 = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.   ";
    
            Spannable spannable = new SpannableString(text2);
            spannable.setSpan(new TopImageSpan(mActivity, R.mipmap.start_quote_green), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
            spannable.setSpan(new TopImageSpan(mActivity, R.mipmap.end_quote_green), text2.length()-1, text2.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    
    
            inspirationalActivityInspirationalTextTv.setText(spannable, TextView.BufferType.SPANNABLE);
    

    TopImageSpan Class For Align Top with text

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.support.annotation.NonNull;
    import android.text.style.DynamicDrawableSpan;
    import android.text.style.ImageSpan;
    
    import java.lang.ref.WeakReference;
    
    /**
     * Created by Humayoon on 8/10/17.
     */
    
    public class TopImageSpan extends ImageSpan {
    
        private WeakReference<Drawable> mDrawableRef;
        public static boolean startQuote = false,EndQuote = true;
    
        public TopImageSpan(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);  // 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;
        }
    }