ImageSpan图文混排设置多个
程序员文章站
2022-05-25 21:30:45
...
今天遇到个问题,记录一下,在使用ImageSpan设置多个相同的图片时候,遇到始终只有最后一次设置的效果。
var imageSpan: ImageSpan = CenterImageSpan(this, R.drawable.line_bg, ImageSpan.ALIGN_BASELINE);
while (index < codeWithLine.length - 1) {
spanString.setSpan(imageSpan, index, index + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
index = index + 2
}
后来查阅SpannableStringInternal的源码发现,如果设置了同一个imageSpan,则会把之前的效果覆盖,下面是关键代码
private void setSpan(Object what, int start, int end, int flags, boolean enforceParagraph) {
//省略部分代码
int count = mSpanCount;
Object[] spans = mSpans;
int[] data = mSpanData;
for (int i = 0; i < count; i++) {
if (spans[i] == what) { //如果传入的imageSpan,是之前传入的,则会更新之前的效果
int ostart = data[i * COLUMNS + START];
int oend = data[i * COLUMNS + END];
data[i * COLUMNS + START] = start;
data[i * COLUMNS + END] = end;
data[i * COLUMNS + FLAGS] = flags;
sendSpanChanged(what, ostart, oend, nstart, nend);
return;
}
}
if (mSpanCount + 1 >= mSpans.length) {
Object[] newtags = ArrayUtils.newUnpaddedObjectArray(
GrowingArrayUtils.growSize(mSpanCount));
int[] newdata = new int[newtags.length * 3];
System.arraycopy(mSpans, 0, newtags, 0, mSpanCount);
System.arraycopy(mSpanData, 0, newdata, 0, mSpanCount * 3);
mSpans = newtags;
mSpanData = newdata;
}
mSpans[mSpanCount] = what;
mSpanData[mSpanCount * COLUMNS + START] = start;
mSpanData[mSpanCount * COLUMNS + END] = end;
mSpanData[mSpanCount * COLUMNS + FLAGS] = flags;
mSpanCount++;
if (this instanceof Spannable)
sendSpanAdded(what, nstart, nend);
}
最后,将代码改成,每次要插入的时候,new一个新的
while (index < codeWithLine.length - 1) {
var imageSpan: ImageSpan = CenterImageSpan(this, R.drawable.line_bg, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(imageSpan, index, index + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
index = index + 2
}
上一篇: 通过ajax传的div没有原有的效果
下一篇: 文件传输协议 php 文件上传系统手记