问题 将html内容呈现为动态“页面”


我正在为Android构建一个电子书阅读器。电子书的内容通常分为html文件(epub),其中包含一个或多个章节。

我打算建立一个电子书阅读器,将这些文件的内容分成不同的“页面”。问题是要知道一页上有多少文本“适合”并计算正确的页面数量,因为这取决于许多不同的因素,例如:字体大小,字号,段落,图像,分页符,头条新闻等

理想我会让我的文本合理和可选,因为普通的TextView或EditText是不可能的,我必须使用不可滚动的WebView。

总而言之,我如何“测量”适合我WebView上一个“页面”的文本数量? 或者有更好的方法来解决这个问题吗?我看到Paint类支持测量文本和breakText。

谢谢!


6731
2018-02-03 15:41


起源

我会认真重新考虑将文本设置为合理的想法,因为它已知不太可读: newsletterfillers.com/archives/design/justified_ragged.htm - Joeri Minnekeer


答案:


注意:此答案不使用webview作为显示表面。

你可以使用 帆布 绘制每一页。画布为您提供高度和宽度,您可以使用它在画布上绘制每一行 的drawText 根据可用的宽度和高度。

基本上你可以计算一行中可以容纳多少个字母,拿出那么多单词,注意不要拆分任何单词并继续绘制文本。

如果你分解了每个段落使用不同工作者的任务,你也可以快速完成。


7
2018-03-05 20:12



使用画布阻止我能够选择文本并有理由: - Richard
你也可以解决这个问题。如果您可以保留屏幕上哪个字符的位置...您可以按照他们的选择对话框[现在也可以是矩形]并翻转这些坐标之间的文本颜色以显示它们已被选中。它更多的是一个工作,但它应该工作:)。 - Ravi Vyas


也许你可以这样做

  • 正在WebView中添加和呈现文本

  • 在WebView中,您可以使用Javascript检查DOM树的当前状态,并提取各个元素的宽度和高度等测量值

  • Javascript通过一些回调将页面大小传回给WebView创建者

  • 当Javascript检测到超出页面大小阈值时,它会发送一个需要分页符的信号

Android HTML5 Kindle使用Javascript打破页面,因此绝对可以。


3
2018-02-04 10:13



试着在我的webview html里面填一个div,直到它使用这个函数溢出但它死得很慢:/ stackoverflow.com/questions/143815/... - Richard
那个特别的答案不是很聪明。有很多方法可以优化它,Kindle可以在JS中完成整个书籍分页。 - Mikko Ohtamaa
例如,操作段落或句子而不是单个字符或单词。 - Mikko Ohtamaa
好吧,我正在处理句子而且它根本不快。来自android的Java执行在一个单独的线程中运行并使用javascript界面​​从javascript通信回到android是死的慢所以不是一个选项我害怕:/ - Richard
啊。这是Android上的瓶颈 - 没想到:(你能减少与整页通信的数量吗? - Mikko Ohtamaa


看看它的来源 FitText 也许 这里。两者都计算出在给定空间中可以容纳多少文本。您可以借鉴他们的想法并根据您的目的进行调整。


1
2018-03-07 04:22