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();
}
}