對于一個富文本編輯器來說,圖文混排是最基本的功能。而從上一篇文章中我們知道圖文混排需要使用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對應的路徑和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;
}
}
對于一般的項目需求來說,不僅僅要展示富文本,還需要保存、傳輸。而一般來說,在保存、傳輸時,需要轉化成html風格的標記語言,這是富文本編輯器的最大坑之一。具體細節(jié)后面專門介紹,繼續(xù)ImageSpan的介紹。上述代碼中我構造的ImageSpan子類,可以在后續(xù)傳輸給服務器時,先上傳圖片,獲取到圖片的url后,再構造標記文本時使用。
我們項目使用的標記文本基本參照了HTML格式規(guī)范,因此轉化代碼如下:
if (characterStyle instanceof ImageSpan) {
ImageSpan span = (ImageSpan) characterStyle;
return String.format("<img src=\"%s\" />", TextUtils.isEmpty(span.getUrl()) ?
span.getFilePath() : span.getUrl());
}
可以看到,如果span中被設置了url(在上傳圖片后設置),那么會將src屬性設置為url,反之則還是用filePath(這里是因為草稿功能的需要,后續(xù)詳細介紹)。
具體富文本轉化,請看后續(xù)講解。