要给BulletSpan添加项目符号,可以借助LeadingMarginSpan来实现。以下是一个示例代码:
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.BulletSpan;
import android.text.style.LeadingMarginSpan;
public class CustomBulletSpan extends BulletSpan {
private static final int BULLET_RADIUS = 5;
private static final int GAP_WIDTH = 20;
public CustomBulletSpan(int color) {
super(GAP_WIDTH, color);
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom,
CharSequence text, int start, int end, boolean first, Layout l) {
if (((SpannableStringBuilder) text).getSpanStart(this) == start) {
Paint.Style style = p.getStyle();
int oldColor = p.getColor();
p.setColor(getBulletColor());
p.setStyle(Paint.Style.FILL);
int yPosition = (top + bottom) / 2;
int bulletX = x + dir * BULLET_RADIUS;
c.drawCircle(bulletX, yPosition, BULLET_RADIUS, p);
p.setColor(oldColor);
p.setStyle(style);
}
}
@Override
public int getLeadingMargin(boolean first) {
// 返回一个大于0的值,使得项目符号和文本之间有一定的间距
return 2 * BULLET_RADIUS + GAP_WIDTH;
}
}
使用方法:
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("First item").append("\n");
builder.append("Second item").append("\n");
CustomBulletSpan bulletSpan = new CustomBulletSpan(Color.BLACK);
builder.setSpan(bulletSpan, 0, builder.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(builder);
上述代码定义了一个CustomBulletSpan类继承自BulletSpan,并重写了drawLeadingMargin()和getLeadingMargin()方法。在drawLeadingMargin()方法中,我们通过调用Canvas的drawCircle()方法来绘制项目符号。在getLeadingMargin()方法中,我们返回一个大于0的值,以便添加项目符号和文本之间的间距。
最后,我们使用SpannableStringBuilder将文本和自定义的BulletSpan应用到TextView中。