4

Google Currentsのように、アプリに1ページの読書スタイルを実装する方法を学んでいます。

内容(テキスト)は画面サイズに基づいて調整され、スクロールやズームはありません。オーバーフローしたテキストは次のページにあります。(ViewPagerを使用していることはわかっていました。)

スクリーンショットは次のとおりです。 先頭ページ テキストがオーバーフローした2ページ目

私の質問は次のとおりです。

  • コンテンツ(テキスト)を画面に合わせる(調整する)にはどうすればよいですか?
  • オーバーフローしたテキストを次の画面に自動的に解析するにはどうすればよいですか?(これにより、ユーザーは画面間をスワイプするだけで読むことができます。)

また、コンテンツにTextViewを使用することを検討しています。(GoogleCurrentはWebViewを使用したと思います)私のアプリはWebViewを使用する必要はありません。textviewがそのように達成することは可能でしょうか?

4

1 に答える 1

3

このようなものをいくつかの TextViews で実装しました。まず、TextView 間をスワイプするための ViewPager を作成しました。その後、長いテキストを複数のブロック (1 ページに 1 つ) に分割します。ページのテキストを取得するには、次の関数を使用します。

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);

Google は webView ではなく TextView を使用していると思います。Spanned と Spannable についてお読みください。リンク、画像、テキストをさまざまなスタイルで 1 つの textView に表示する機能があります。

于 2013-02-01T10:16:35.740 に答える