對于一個富文本編輯器來說欢峰,圖文混排是最基本的功能。而從上一篇文章中我們知道圖文混排需要使用ImageSpan坑夯。下面這段代碼摘自我的RichEditText源碼:
/**
* 添加圖片
* @param filePath 圖片文件路徑
*/
public void addImage(String filePath) {
SpannableString spannable = new SpannableString("\n<img src=\"" + filePath + "\"/>");
Bitmap bitmap = BitmapUtils.decodeScaleImage(filePath, IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT);
if (bitmap == null) {
return;
}
ImageSpan span = new ImageSpan(mContext, bitmap, filePath);
spannable.setSpan(span, 1, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getText().insert(getSelectionStart(), spannable);
}
參數(shù)是圖片文件路徑,BitmapUtils源碼請查看項目工程抡四。這個span的最前面加了一個換行柜蜈,是因為當時項目要求插入圖片之前必須換行。
而這個ImageSpan是我繼承了系統(tǒng)的ImageSpan寫的一個子類指巡,主要是在圖片之外還保存了該image對應(yīng)的路徑和url信息:
public class ImageSpan extends android.text.style.ImageSpan implements Span<String> {
private String mFilePath;
private String mUrl;
public ImageSpan(Context context, Bitmap bitmap, String filePath) {
super(context, bitmap);
mFilePath = filePath;
}
public ImageSpan(Drawable drawable) {
super(drawable);
}
public String getFilePath() {
return mFilePath;
}
public String getUrl() {
return mUrl;
}
public void setUrl(String url) {
mUrl = url;
}
@Override
public String getValue() {
return mUrl;
}
}
對于一般的項目需求來說淑履,不僅僅要展示富文本,還需要保存藻雪、傳輸秘噪。而一般來說,在保存勉耀、傳輸時指煎,需要轉(zhuǎn)化成html風格的標記語言,這是富文本編輯器的最大坑之一便斥。具體細節(jié)后面專門介紹至壤,繼續(xù)ImageSpan的介紹。上述代碼中我構(gòu)造的ImageSpan子類枢纠,可以在后續(xù)傳輸給服務(wù)器時像街,先上傳圖片,獲取到圖片的url后晋渺,再構(gòu)造標記文本時使用镰绎。
我們項目使用的標記文本基本參照了HTML格式規(guī)范,因此轉(zhuǎn)化代碼如下:
if (characterStyle instanceof ImageSpan) {
ImageSpan span = (ImageSpan) characterStyle;
return String.format("<img src=\"%s\" />", TextUtils.isEmpty(span.getUrl()) ?
span.getFilePath() : span.getUrl());
}
可以看到木西,如果span中被設(shè)置了url(在上傳圖片后設(shè)置)畴栖,那么會將src屬性設(shè)置為url,反之則還是用filePath(這里是因為草稿功能的需要八千,后續(xù)詳細介紹)驶臊。
具體富文本轉(zhuǎn)化,請看后續(xù)講解叼丑。