我正在学习如何为我的应用程序实现单页阅读风格,例如Google Currents。
根据屏幕尺寸调整内容(文本),没有滚动,没有缩放。 溢出的文本在下一页。 (我知道它正在使用ViewPager。)
这是屏幕截图:
我的问题是:
另外,我正在考虑使用TextView作为内容。 (GoogleCurrent使用WebView,我认为)我的应用程序不需要使用WebView。 textview是否可以实现这样的目标?
答案 0 :(得分:3)
我用几个TextView实现了这样的东西。首先,我创建了一个ViewPager,用于在TextView之间进行swyping。 之后我将长文本分成几个块,每页一个。 要获取页面的文本,我使用此函数:
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);
我觉得,谷歌使用的是TextView,而不是webView。阅读Spanned和Spannable。它能够在一个textView中显示不同风格的链接,图像和文本。