【问题标题】:Separate long text into pages for viewpager将长文本分成页面以供 viewpager
【发布时间】:2015-07-26 04:43:17
【问题描述】:

我正在this question 中实现messureText 方法,以便在viewpager 中呈现之前将长文本分成具有指定大小的页面。我正在做一个增加字符数的while循环来获得所需的文本块,但这似乎不是最好的解决方案。有什么建议可以提高此计算的性能吗? p/s:我指的是 Wattpad 应用,看到它做得非常快,但不知道它是怎么做到的?

【问题讨论】:

    标签: java android string text character


    【解决方案1】:

    StaticLayoutDynamicLayout 可以做到这一点。 Android 使用 (Boring|Static|Dynamic) 布局类来测量和包装文本,这些类构造函数将 CharSequence 作为输入参数,因此样式文本(包含跨度,甚至 ImageSpan)是可以接受的。 您可以根据您的视图或屏幕计算pageWidthpageHeightTextPaint 和两个lineSpacing 参数必须等于您的目标TextView,这是我的代码:

    import android.text.Layout;
    import android.text.SpannableStringBuilder;
    import android.text.StaticLayout;
    import android.text.TextPaint;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class PageSplitter {
        private final int pageWidth;
        private final int pageHeight;
        private final float lineSpacingMultiplier;
        private final float lineSpacingExtra;
        private final List<CharSequence> pages = new ArrayList<CharSequence>();
        private SpannableStringBuilder mSpannableStringBuilder = new SpannableStringBuilder();
    
        public PageSplitter(int pageWidth, int pageHeight, float lineSpacingMultiplier, float lineSpacingExtra) {
            this.pageWidth = pageWidth;
            this.pageHeight = pageHeight;
            this.lineSpacingMultiplier = lineSpacingMultiplier;
            this.lineSpacingExtra = lineSpacingExtra;
        }
    
        public void append(CharSequence charSequence) {
            mSpannableStringBuilder.append(charSequence);
        }
    
        public void split(TextPaint textPaint) {
            StaticLayout staticLayout = new StaticLayout(
                    mSpannableStringBuilder,
                    textPaint,
                    pageWidth,
                    Layout.Alignment.ALIGN_NORMAL,
                    lineSpacingMultiplier,
                    lineSpacingExtra,
                    false
            );
            int startLine = 0;
            while(startLine < staticLayout.getLineCount()) {
                int startLineTop = staticLayout.getLineTop(startLine);
                int endLine = staticLayout.getLineForVertical(startLineTop + pageHeight);
                int endLineBottom = staticLayout.getLineBottom(endLine);
                int lastFullyVisibleLine;
                if(endLineBottom > startLineTop + pageHeight)
                    lastFullyVisibleLine = endLine - 1;
                else
                    lastFullyVisibleLine = endLine;
                int startOffset = staticLayout.getLineStart(startLine);
                int endOffset = staticLayout.getLineEnd(lastFullyVisibleLine);
                pages.add(mSpannableStringBuilder.subSequence(startOffset, endOffset));
                startLine = lastFullyVisibleLine + 1;
            }
        }
    
        public List<CharSequence> getPages() {
            return pages;
        }
    }
    

    【讨论】:

    • tks...很好。我使用了静态布局
    • 嘿。很好的解决方案,似乎它也应该解决我的问题。但是,不幸的是,我无法理解/遵循代码流。你能否分享一个实现,这个类在哪里被调用?请分享。 Manz 提前致谢!
    【解决方案2】:

    您可以在代码中使用BufferedReader。您可以将字符串留在其中并在此阅读器中传递操作。会比先用它创建一个字符串更有效率。

    【讨论】:

    • tks 寻求帮助。如果使用 BufferedReader,只能在那里阅读长文本。想要将这些长文本分成每个页面以包含在我应该做的 viewpager 中吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多