1. 程式人生 > >帶行間距的TextView,讓文字和ImageSpan中的圖片居中顯示

帶行間距的TextView,讓文字和ImageSpan中的圖片居中顯示

上一篇部落格,講了怎麼讓匹配表情、連結、關鍵字等等。上篇部落格

http://blog.csdn.net/u014620028/article/details/52277102

但是,也留下了一個問題。就是行間距的問題。例如:
給展示行間距的textview,加上屬性:android:lineSpacingMultiplier="1.4",用之前的處理方法,當文字行數多的時候,會出現表情混亂的情況:
這裡寫圖片描述

解決後的效果圖:
1、表情和文字基本一樣大
這裡寫圖片描述
2、表情大於文字:
這裡寫圖片描述
3、表情小於文字:
這裡寫圖片描述

解決辦法:
1、重新ImageSpan的draw方法,重新計算、擺放表情等圖片
MyImageSpan:

package com.chen.customviewdemo.view;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;

public class MyImageSpan extends ImageSpan {

    public MyImageSpan(Drawable drawable) {
        super(drawable);
    }

    @Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { Paint.FontMetricsInt fm = paint.getFontMetricsInt(); Drawable drawable = getDrawable(); int transY = (y + fm.descent + y + fm.ascent) / 2
- drawable.getBounds().bottom / 2; canvas.save(); canvas.translate(x, transY); drawable.draw(canvas); canvas.restore(); } }

2、在MyTextView中,設定Url前面回形針圖片的時候使用:
將上篇部落格中,對應的程式碼,改為:

try {
                    //“點選連結”前面的回形針圖片。大小可自己調整
                    Drawable drawable = context.getResources().getDrawable(R.mipmap.web_link);
                    drawable.setBounds(0, 0, 33, 33);
//                    ImageSpan imgSpan = new ImageSpan(drawable);
                    spannableString.setSpan(new MyImageSpan(drawable), urlStartOld + urlTemp.indexOf(CHEN.REPLACEMENT_STRING), urlStartOld + urlTemp.indexOf(CHEN.REPLACEMENT_STRING) + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

                } catch (Exception e) {
                    //異常以後,就不加小圖片了
                }

替換了spannableString.setSpan的第一個引數。其他不變

3、把ExpressionUtil下,dealSpannableString()中,對應程式碼替換為:

if (id != 0) {
                Drawable drawable = context.getResources().getDrawable(id);
                drawable.setBounds(0, 0, Utils.sp2px(context, emojiSize), Utils.sp2px(context, emojiSize));
//                ImageSpan imgSpan = new ImageSpan(drawable);
                int end = matcher.start() + key.length();
                spannableString.setSpan(new MyImageSpan(drawable), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                if (end < spannableString.length()) {                        //如果整個字串還未驗證完,則繼續。。
                    dealSpannableString(context, spannableString, patten, end, emojiSize);
                }
                break;
            }

注意spannableString.setSpan的第一個引數