首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LeadingMarginSpan:从getLeadingMargin返回的动态值(为什么在drawLeadingMargin之前调用getLeadingMargin?)

LeadingMarginSpan:从getLeadingMargin返回的动态值(为什么在drawLeadingMargin之前调用getLeadingMargin?)
EN

Stack Overflow用户
提问于 2015-10-16 08:36:07
回答 1查看 788关注 0票数 2

这个问题是关于LeadingMarginSpan接口的。

的目标:--我想从getLeadingMargin()返回一个动态值,根据文本的高度计算。只有在drawLeadingMargin()调用期间才能检测到文本高度。

问题1:如文档所述的

drawLeadingMargin()称为,在之前,由getLeadingMargin()返回的值对边距进行调整。

但那不是真的。我试着调试它,我发现getLeadingMargin()drawLeadingMargin()之前被称为twise,在一次之后:

代码语言:javascript
运行
复制
System.out: getLeadingMargin
System.out: getLeadingMargin
System.out: drawLeadingMargin
System.out: getLeadingMargin

所以,在前两个调用中,我仍然不知道文本的高度,所以我必须返回0作为领先的保证金。然后(在drawLeadingMargin()调用期间)保存文本高度,从此时起我可以从getLeadingMargin()返回非零值。但这导致了第二个问题。

问题2:如果在前两个调用中getLeadingMargin()返回0,但是(在drawLeadingMargin()之后)返回>0,则文本将被截断:

PS:由于性能原因,我不想在构建文本之后再调用requestLayout()一次。

源代码

LMarginSpan

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);
    }
});
EN

Stack Overflow用户

发布于 2016-04-14 16:04:39

您可以将TextView传递给您的自定义Spannable以从中获取油漆。例如:

代码语言:javascript
运行
复制
private Paint paint;

public CustomSpannable(TextView textView) {
    paint = textView.getPaint();
}

public int getLeadingMargin(boolean first) {
    return mPaint.measureText("text"));
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33165928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档