想写个自己用的txt阅读器,突然发现写一个notepad挺麻烦的啊= =b

2012-08-08 20:50:31 +08:00
 rightgenius
例如,总页数咋办,因为一方面文本自己会有换行符,而因为屏幕宽度的问题,原本的一行可能会变成很多行。

为了统计行数,似乎得通过计算字号的宽度,然后动态计算一共多少行,但这问题又来了,英文不是等宽啊= =b

不知道行数,似乎进入程序,直接从30%开始这样的功能也实现不了……

囧,不知道有没有其他的好办法。。。
10507 次点击
所在节点    Android
13 条回复
miao
2012-08-08 21:09:34 +08:00
写成html网页格式,想怎么控制都行,用浏览器看。或找别人写好的程序,xbeta.info很多介绍
rightgenius
2012-08-08 22:46:37 +08:00
@miao 额,那加载本地文件方便嘛?页数还是解决不了啊 = =b
xatest
2012-08-08 22:51:34 +08:00
百分比按字节数算就够了吧,不用管行数,按记录的字节数偏移作为本页的起始,然后开始显示~
ljbha007
2012-08-08 23:37:27 +08:00
一般文本文件都不大 你可以一下全部放到控件里边 然后统计该控件被占了多少行 然后屏幕上放不下的部分就隐藏
rightgenius
2012-08-08 23:39:28 +08:00
@xatest 有道理~另一方面,希望不要把整篇文档放到内存里,例如取出阅读页相关的页面,这种不知道有没有必要。如果坐的话,似乎如何把文章分块也是一个问题@_@
rightgenius
2012-08-08 23:40:43 +08:00
@ljbha007 网络小说有的还是比较大的啊,就是在电脑上用txt打开都有可能会卡的那种……
ljbha007
2012-08-08 23:41:41 +08:00
@rightgenius 你看看sublime text 2不是就是直接把所有文本统统载入嘛 你想想要是一个文件大得文本编辑器打开都会卡了 你还会用文本编辑器来打开它吗?
ljbha007
2012-08-08 23:42:20 +08:00
@rightgenius 那就异步加载嘛 加载一部分 显示一部分 只要UI不卡住就没问题
ljbha007
2012-08-08 23:45:09 +08:00
@rightgenius 我以前用我老掉牙的HTC G4手机(600Mhz) 打开黑格尔的整部《小逻辑》 也只需要几秒钟 如果用多线程的话 用户根本感觉不出来
jjgod
2012-08-09 05:50:32 +08:00
1. 精确的总页数必须把整篇文章排版完才知道,但可以用一些方法估计到大致不错的,比如根据目前读入的字节数和排版完成的页数计算平均值,乘以总的字节数。

2. 行数类似,你也可以按照文件本身的换行来计算,当然这不是完全精确的。记录进度的时候也可以记阅读到的位置在文件中的行数,而不是显示的行数。这样重新载入时就可以直接显示从那一行开始的内容。要想直接跳到指定位置也可以记录一下文件偏移到该行数的映射,载入的时候直接 seek 过去。

3. 事实上第一次排版之后总的页数、显示时的行数都确定了,只要文件不改变这些就不会变,所以可以和文件的 hash 值一起记下来,只要文件 hash 不变就不重新计算,这样每次载入文件都只需要排版一页,翻页的时候再排版下一页就可以了。

4. 现在的 Android 手机,载入几十 M 的 txt 文件完全不在话下,主要的开销还是排版的时间和内存占用。
thinkinnight
2012-08-09 09:01:19 +08:00
哈哈,是在啥上面写?PC用的,还是手机用的?用什么语言?
在windows上面,对于字体的大小是可以通过API得到的
thinkinnight
2012-08-09 09:27:34 +08:00
晕,原来是Android节点,Android上面对于字体不清楚是否有这样的API。
其实阅读器比Notepad还要好做一些,因为没有了编辑,Undo/redo,保存等这样的操作,文件仅仅是只读的,可以在第一次读入的时候,将需要的信息做出一个数据结构,同时保存起来,下次打开的时候,直接从这个数据结构中得到就可以了。
行数和界面上换行是没有具体联系的,\n也就是一个普通的字符而已,所以还是一共有多少字符,现在跳转即可。而界面上可以进行处理。
rightgenius
2012-08-09 22:56:28 +08:00
@jjgod 哇,好精彩~这让我想到可不可以用一个隐藏的窗口把文章排进去,拿到参数后就销毁掉~
周末试试~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/44610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX