Android TextView 富文本SpannableString 文字+圖片居中顯示,支持圖片換行居中顯示

Android TextView 富文本SpannableString 文字+圖片居中顯示

代碼示意:

注意1. drawable 爲圖片資源,只能是一整張圖,如酒店星級,5星級一張5個星星的圖片,不能是1個星星循環5次拼接一起,因爲涉及到圖片換行顯示。
2. textView先顯示文本,後加空格" ",然後再拼接圖片上去。
3. 需要根據字段映射不同的圖片,如1-5星級,對應的不同的圖片drawable和iconWidth.

textView.setText(title); // **設置文字**
...

/**
     * 標題末尾插入星鑽
     */
    public static void insertDrawable(Context context, TextView tv, Drawable drawable, SpannableString sb, int iconWidth) {
        if (drawable == null || sb == null) {
            return;
        }
        drawable.setBounds(ExtendUtils.dip2px(context, 2), 0, ExtendUtils.dip2px(context, iconWidth), ExtendUtils.dip2px(context, 10));  // 最後兩個參數分別爲圖片寬度、高度
        //用這個drawable對象代替字符串
        HotelListImageSpan span = new HotelListImageSpan(drawable);
        //包括0但是不包括"star".length()即:4
        sb.setSpan(span, 0, "star".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        tv.append(sb); // **在最後添加圖片**
    }

自定義ImageSpan代碼:

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

/**
 * 列表頁富文本,支持圖片換行居中
 */
public class HotelListImageSpan extends ImageSpan {

    public HotelListImageSpan(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) {
        Drawable b = getDrawable();
        canvas.save();
        int transY;
        //要顯示的文本高度-圖片高度除2等居中位置+top(換行情況)
        transY = ((bottom - top) - b.getBounds().bottom) / 2 + top;
        //偏移畫布後開始繪製
        canvas.translate(x, transY);
        b.draw(canvas);
        canvas.restore();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章