ImageSpan图文混排设置多个

今天遇到个问题,记录一下,在使用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
}

 

 

你可能感兴趣的:(ImageSpan图文混排设置多个)