如何在屏幕大小的块中拆分HTML文件的内容,以便在WebKit浏览器中"分页"它?
每个"页面"应显示完整的文本量.这意味着不得在屏幕的顶部或底部边框中将一行文本切成两半.
编辑
这个问题最初标记为"Android",因为我打算构建一个Android ePub阅读器.但是,似乎解决方案只能使用JavaScript和CSS实现,因此我扩大了问题的范围,使其与平台无关.
我有一个全屏TextView持有一个需要滚动的长跨度.TextView的getLineCount()为我提供了整个文本块使用的总行数,但我想知道屏幕上当前可以看到多少行文本.
或者,更好的是,有没有办法找出屏幕上当前可见的线条范围?例如,当视图滚动时,我可以告诉20-60行当前是否可见?
我正在尝试使用绘制文本Canvas并发现使用StaticLayout会自动处理换行符。我还想限制它的高度,以便当文本太长时它会被椭圆化,但文本容器的大小是动态的。我可以轻松地将宽度应用于StaticLayout,但无法找到设置高度的方法。
我尝试使用TextUtils.ellipsize(),但在获取行之间的间距时遇到问题。
我正在开发一个application看起来像电子书阅读器,但它不是一个电子书阅读器.我有一个巨大的文本,分为不同的章节.现在我想把这个文本呈现为一本书,用户应该感觉阅读一本电子书,它将具有各种功能,如GoTo搜索,目录和最重要的页面之间的页面卷曲过渡.
现在的问题是如何将整个内容划分为多个页面.我怎么知道,适合屏幕的字符数(取决于屏幕大小和字体大小).我完全不知道从哪里开始以及如何继续.
最终,我计划开发一个电子书阅读器,它只能阅读一本书,这是我给出的文字.
请让我知道实现这一点,在哪里放置分页符以及放置文本的位置(在数据库或资源文件中).
我在文件[~100 KB]中有一些文本需要在一个文件中显示给用户TextView.我想将文本拆分成页面.
这是我想要实现分页的想法:
320 x 480.px]以容纳按钮等.N可以显示的字符数[ ].N字符数.这似乎可行,但看起来很粗糙,容易出错.有没有人有更好的想法?
我想画SpannedString一个Canvas.
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 1, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
Run Code Online (Sandbox Code Playgroud)
上面的例子是使用a绘制的TextView,而a又使用a Layout来绘制带有跨度的文本.我知道使用a Layout是向画布绘制文本的推荐方法.但是,我从头开始制作自己的文本布局,所以我需要自己实现.
做这样的事情是行不通的
canvas.drawText(spannableString, 0, spannableString.length(), 0, 0, mTextPaint);
Run Code Online (Sandbox Code Playgroud)
因为drawText只从中获取文本spannableString,而不是任何跨度.绘图颜色分别处理TextPaint.
如何使用canvas.drawText(或drawTextRun)绘制跨度信息(特别是前景和背景颜色)?
有关
计划解决方案
我打算直接做一个自我回答,但事实证明这比我想象的更难.所以我会先发帖,然后在我弄清楚的时候添加一个答案.(我当然欢迎任何人先回答.)
这是我到目前为止的作品:
drawTextRun绘制文本(例子)(更新:未添加至API 23)getRunAdvance测量从哪里开始的下一个文本运行( …有没有办法检查 TextView 的文本是否超过了最大行数?我找到了,TextView.getLineCount()但这只能告诉我是否使用了最大行数,而不能告诉我是否超过了最大行数。
编辑:
到目前为止,我有:
text_view.post(new Runnable() {
@Override
public void run() {
if (text_view.getLineCount() < text_view.getMaxLines()) {
// do stuff
}
}
});
Run Code Online (Sandbox Code Playgroud)
但这不会检测它是否超过了最大行数,即如果它使用大于或等于最大行数,则 if 语句将通过。这是因为如果它使用超过最大行数,那么 getLineCount 只会返回最大行数,不会更多。
请注意,文本视图的文本在我的代码中以编程方式设置得更高,而不是在 XML 中硬编码。
我有一个很长的文本,我想打破多个页面.我还需要一种方式来设置这个文本的样式.
android ×7
pagination ×2
text ×2
textview ×2
canvas ×1
css ×1
drawtext ×1
html ×1
java ×1
javascript ×1
page-break ×1
paint ×1
screen ×1
spannable ×1
staticlayout ×1
styledtext ×1
webkit ×1