V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rightgenius
V2EX  ›  Android

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

  •  
  •   rightgenius · 2012-08-08 20:50:31 +08:00 · 11081 次点击
    这是一个创建于 4519 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如,总页数咋办,因为一方面文本自己会有换行符,而因为屏幕宽度的问题,原本的一行可能会变成很多行。

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

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

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

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

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

    4. 现在的 Android 手机,载入几十 M 的 txt 文件完全不在话下,主要的开销还是排版的时间和内存占用。
    thinkinnight
        11
    thinkinnight  
       2012-08-09 09:01:19 +08:00
    哈哈,是在啥上面写?PC用的,还是手机用的?用什么语言?
    在windows上面,对于字体的大小是可以通过API得到的
    thinkinnight
        12
    thinkinnight  
       2012-08-09 09:27:34 +08:00   ❤️ 1
    晕,原来是Android节点,Android上面对于字体不清楚是否有这样的API。
    其实阅读器比Notepad还要好做一些,因为没有了编辑,Undo/redo,保存等这样的操作,文件仅仅是只读的,可以在第一次读入的时候,将需要的信息做出一个数据结构,同时保存起来,下次打开的时候,直接从这个数据结构中得到就可以了。
    行数和界面上换行是没有具体联系的,\n也就是一个普通的字符而已,所以还是一共有多少字符,现在跳转即可。而界面上可以进行处理。
    rightgenius
        13
    rightgenius  
    OP
       2012-08-09 22:56:28 +08:00
    @jjgod 哇,好精彩~这让我想到可不可以用一个隐藏的窗口把文章排进去,拿到参数后就销毁掉~
    周末试试~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   841 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 21:27 · PVG 05:27 · LAX 13:27 · JFK 16:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.