首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制LeadingMarginSpan2的文本方向

强制LeadingMarginSpan2的文本方向
EN

Stack Overflow用户
提问于 2015-07-26 21:21:58
回答 1查看 523关注 0票数 5

我按照建议使用LeadingSpanMargin2来设置我的TextView的样式,以便它可以在Image中流动,问题是我设置的文本是动态的,可以是rtl或ltr。

我尝试了我能想到的任何方法来修复leadingMargin,使其在两种情况下都是向右或向左,但都没有效果。

另外,我已经尝试了在github中发布的FlowTextView小部件,它不能很好地工作在FlowTextView的情况下,所以请不要这样建议。

非常感谢。

下面是我使用的代码,这是在另一个答案中建议的:

代码语言:javascript
复制
public void setFlowText(CharSequence text, int width , int height, TextView messageView)
{
    float textLineHeight = messageView.getPaint().getTextSize();

    // Set the span according to the number of lines and width of the image
    int lines = (int)Math.ceil(height / textLineHeight);
    //For an html text you can use this line: SpannableStringBuilder ss = (SpannableStringBuilder)Html.fromHtml(text);
    SpannableString ss = new SpannableString(text);
    ss.setSpan(new MyLeadingMarginSpan2(lines, width), 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //ss.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    messageView.setText(ss);

    // Align the text with the image by removing the rule that the text is to the right of the image
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)messageView.getLayoutParams();
    int[]rules = params.getRules();
    rules[RelativeLayout.RIGHT_OF] = 0;
}

public class MyLeadingMarginSpan2 implements LeadingMarginSpan2 {
    private int margin;
    private int lines;
    private boolean wasDrawCalled = false;
    private int drawLineCount = 0;

    public MyLeadingMarginSpan2(int lines, int margin) {
        this.margin = margin;
        this.lines = lines;
    }

    @Override
    public int getLeadingMargin(boolean first) {
        boolean isFirstMargin = first;
        // a different algorithm for api 21+
        if (Build.VERSION.SDK_INT >= 21) {
            this.drawLineCount = this.wasDrawCalled ? this.drawLineCount + 1 : 0;
            this.wasDrawCalled = false;
            isFirstMargin = this.drawLineCount <= this.lines;
        }

        return isFirstMargin ? this.margin : 0;
    }

    @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) {
        this.wasDrawCalled = true;
    }

    @Override
    public int getLeadingMarginLineCount() {
        return this.lines;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-22 23:48:43

出于一些未知的原因,你可以通过传递以下命令来获得左边距:

代码语言:javascript
复制
ss.setSpan(new MyLeadingMarginSpan2(lines, width), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

要获得正确的边际,你需要通过:

代码语言:javascript
复制
ss.setSpan(new MyLeadingMarginSpan2(lines, width), 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

我不知道这是怎么回事,但这行得通!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31637441

复制
相关文章

相似问题

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