这个问题是关于LeadingMarginSpan
接口的。
的目标:--我想从getLeadingMargin()
返回一个动态值,根据文本的高度计算。但只有在drawLeadingMargin()
调用期间才能检测到文本高度。
问题1:如文档所述的:
drawLeadingMargin()
称为,在之前,由getLeadingMargin()
返回的值对边距进行调整。
但那不是真的。我试着调试它,我发现getLeadingMargin()
在drawLeadingMargin()
之前被称为twise,在一次之后:
System.out: getLeadingMargin
System.out: getLeadingMargin
System.out: drawLeadingMargin
System.out: getLeadingMargin
所以,在前两个调用中,我仍然不知道文本的高度,所以我必须返回0
作为领先的保证金。然后(在drawLeadingMargin()
调用期间)保存文本高度,从此时起我可以从getLeadingMargin()
返回非零值。但这导致了第二个问题。
问题2:如果在前两个调用中getLeadingMargin()
返回0
,但是(在drawLeadingMargin()
之后)返回>0
,则文本将被截断:
PS:由于性能原因,我不想在构建文本之后再调用requestLayout()
一次。
源代码
LMarginSpan
class LMarginSpan implements LeadingMarginSpan
{
float lineHeight = 0f;
@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 layout) {
System.out.println("drawLeadingMargin");
lineHeight = p.getFontSpacing();
}
@Override
public int getLeadingMargin(boolean first) {
System.out.println("getLeadingMargin");
return (int) lineHeight;
}
}
MainActivity
findViewById(R.id.Btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SpannableStringBuilder sb = new SpannableStringBuilder("Hello world!");
sb.setSpan(new LMarginSpan(), 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
((TextView) findViewById(R.id.Txt1)).setText(sb);
}
});
发布于 2016-04-14 16:04:39
您可以将TextView传递给您的自定义Spannable以从中获取油漆。例如:
private Paint paint;
public CustomSpannable(TextView textView) {
paint = textView.getPaint();
}
public int getLeadingMargin(boolean first) {
return mPaint.measureText("text"));
}
https://stackoverflow.com/questions/33165928
复制相似问题