4

我正在学习如何为我的应用实现单页阅读风格,例如在 Google Currents 中。

内容(文本)根据屏幕大小调整,没有滚动,没有缩放。溢出的文本在下一页。(我知道它正在使用 ViewPager。)

这是屏幕截图: 第一页 文本溢出的第二页

我的问题是:

  • 我怎样才能适应(调整)内容(文本)到屏幕上?
  • 如何自动将溢出的文本解析到下一个屏幕?(这样用户只需在屏幕之间滑动即可阅读。)

另外,我正在考虑使用 TextView 作为内容。(我认为 GoogleCurrent 使用了 WebView)我的应用不需要使用 WebView。textview 是否有可能实现这样的目标?

4

1 回答 1

3

我用几个 TextView 实现了类似的东西。首先,我创建了一个 ViewPager 用于在 TextView 之间切换。之后,我将长文本分成几个块,每页一个。要获取页面的文本,我使用此功能:

TextView tv = new TextView(context); //creating text view
        int width = mtv.getWidth() - tv.getPaddingLeft()-tv.getPaddingRight(); //get width for text
        int lHeight = tv.getLineHeight(); getting line height
        int height = ((View)mtv.getParent()).getHeight() - tv.getPaddingBottom()-tv.getPaddingTop(); // getting height of text
        int linesCount = (int)Math.floor((float)height/lHeight); // get line count on page
        String tmpText = "";
        for (int i =0; i<linesCount; i++)
        {
            int index = Math.min(mtv.getLayout().getPaint().breakText(text, true, width, new float[0]), text.indexOf('\n')+1); // breaking text to lines. To use this you need mtv to be measured
            String t = text.substring(0, index); //getting text for this textview
            if (index+1 < text.length() && (text.charAt(index+1)!=' ' || text.charAt(index+1)!='\n') && t.lastIndexOf(" ")>0) 
                index = t.lastIndexOf(" ")+1; // hack for situation when line starts with " "

            text = text.substring(index);//getting text for next iteration
            t = t.substring(0, index);
            tmpText+=t;
        }
        //I use spannable string for links and some styles. Recalculating spans for new indexes
        SpannableString s = new SpannableString(tmpText);
        Object os[] = spanned.getSpans(offset, offset + tmpText.length(), Object.class);
        for (Object o: os)
        {
            int start = spanned.getSpanStart(o)-offset;
            int end = spanned.getSpanEnd(o)-offset;
            if (start < 0)
                start = 0;
            if (end>=s.length())
                end = s.length()-1;
            s.setSpan(o, start, end, spanned.getSpanFlags(o));
        }
        offset+=tmpText.length();

        while (text.startsWith(" ") || text.startsWith("\n"))
        {
            text = text.substring(1);
            offset++;
        }
        tv.setText(s);

Nad 我认为,谷歌使用 TextView,而不是 webView。阅读有关 Spanned 和 Spannable 的信息。它能够在一个 textView 中显示不同样式的链接、图像、文本。

于 2013-02-01T10:16:35.740 回答