我通过扩展BulletSpan
来创建自定义LeadingMarginSpan
,以在TextView
中绘制自定义项目符号项。 LeadingMarginSpan
的文档说它可以嵌套(即多级子弹):
单个段落可以有多个前导边距;他们 将按顺序呈现,每个都将其边距添加到之前的边距。
LeadingMarginSpan
类有这个方法:
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);
我不知道该方法的实现是应该计算缩进本身还是缩进。跨设备有不同的行为。例如,在 API级别21 中,x
的调用始终为0,在 API级别23 中,调用不同级别的x
。< / p>
那么,实现此方法的正确方法是什么?
当前实施与原始BulletSpan
:
@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 (((Spanned) text).getSpanStart(this) == start) {
...
if (c.isHardwareAccelerated()) {
...
c.translate(x + dir * mBulletRadius,
(top + bottom) / 2.0f);
...
} else {
c.drawCircle(x + dir * mBulletRadius,
(top + bottom) / 2.0f, mBulletRadius, p);
}
...
}
...
}
API级别21 中的行为:
o Level 1
o Level 2
o Level 3
o Level 3
o Level 2
API级别23 中的行为:
o Level 1
o Level 2
o Level 3
o Level 3
o Level 2
提前致谢