我的首个电子书软件--嘎嘎读书 的开发(八)

来源:互联网 发布:覆盖索引 mysql 编辑:程序博客网 时间:2024/05/17 22:21

         今天讲阅读页,这作为嘎嘎读书系列的最后一篇文章吧,然后我会开始另外的项目分享,废话不说。先上截图。


            还记得上篇文章最后的提醒么,大家必须先具备了自定义view的重绘等相关知识,才能做出阅读页。首先去百度下“android自定义view”这个关键词吧。我先来说下为什么要使用android的自定义view。

            大家会发现譬如ireader 书旗等读书软件,都会有一个近似真实的翻页效果的阅读页,而android原生的view能够承接字体的比如textview,edit 都是不能够满足此效果的,这个时候,原生那些好用的view或者>p.measureText方法来测试一下,将200个字中前17个字拿出来,构成字符串,调用p.measureText(str) 如果返回值小于400 就测试18个字,18个字还小,就测试19个字,直到超过400停止,比如此时发现时20个字超过400,那么合适的字数就是19,那么将200个字的前19个字取出,将来放在第一行,剩下的字开始组装下一行的文字,依次循环,直到200个字都用光,我们就可以得到很多一行一样的文字。

     接下来,我们就需要将这些分好的行文字分页,因为任何一篇正常的文章都不可能一屏将所有文字都显示完全,分页的规则很简单,类似于分行,只不过并不需要measure方法,譬如24号字,而手机屏幕可以绘制范围是720高,那么大概能承担720/24=30行文字,而事实上 如果我们真这么干,那么最后文字将会挤在一起没法阅读。因为我们忘了其实有个行距的概念,这个也是可以自己估计的,比如我们要单倍的行距,也就是说两行文字间相隔一行文字的距离,那么我们手机屏幕一屏可以绘制的行数就是720/48=15行左右,而根据不同手机,或者我们的审美感觉,可以自定义比较合适的行距来调节一屏可绘制行数。这个就看个人的喜好了。

    最后我们讲准备好的15行文字封转到一个数据结构中,为绘制做准备,当onDraw被调用时,就在屏幕上对应的位置绘制出每行文字,一屏文字就绘制完毕,而且你会看到距离什么的都刚刚好,而如果还有剩余的文字,那么这些文字当然就成为下一页要绘制的文字,那么下一页只要仿照此页的做法,绘制文字,最终总会将所有文字绘制到屏幕上。而我们要的读书的效果就有了。

    讲到这里,大家应该有一个初步概念,我们必须先将一个长文字按照画笔和屏幕的设置,分割成行以及页的数据结构,然后交由view来有序绘制。而将来我要用view显示任何一段文字,只要将这段文字传入view,view的工作就是先将文字分析,然后绘制。这样一个大概的流程就形成了。

    下面先贴出来用来存储被分割后文字的数据结构:

    1.一行文字的存储数据结构:

     


    从上面可以看出,我这个数据结构中并没有记录具体的字符串,而是记录了这个行子串的开头和结尾在原串中的位置,这当然是考虑节约内存,因为一篇文章的文字时比较多的,而如果每个结构都存储一个子串,会给内存带来双倍的开销。
    2.一页文字的存储数据结构:
    
        上面的代码中 使用了一个list来存储每行的数据,同时有一个StringRulerBean>


        我特别气愤的是我写了两个小时的东西,竟然没有保存下来,我都点保存了,结果竟然!没了!还找不回来了!伤心!这个编辑器太坑了。nnd!算了 不写了,大家应该没有看到关于动画 帧 双缓冲的内容!因为点了发表文章之后发现!直接给我阉割掉了!nnd!气死我了!老子不写了!起码有一千字不见了!我灰常生气!下面贴出来源码大家自己看吧!我就当我写了.....顺便提醒下大家用这个csdn的编辑器 不要用那个直接往里面贴源码的那个功能!估计就是那个功能坑的爹啊!老老实实用代码片吧!编辑器!我去年买了个表!!!!



         除此之外就是一些事件侦听的添加,以及和activity之间的交互等等。这里就略过不说了。我下面将整个阅读页需要用到的代码完整的贴在下方。有兴趣的同学可以捏着鼻子读一读。
         xml文件:
        其中引用了一个自定义view 即刚才讲的那个view
        Readview.java文件:
       包含上文中的大部分内容。
        activity文件:

         

         到此为止,整个项目就算我得不得完了。简单总结下项目中需要用到的知识点:文件读写,线程,url请求,自定义view ,SharedPreferences,listview,gridview,android的service...等等吧。欢迎大家下载试用,并给我提好的建议。下载地址在第一篇文章中。
        虽然我知道我该说的可能没说到,不该说的有点啰嗦,但毕竟这是我第一次分享,还是请见谅啦!而且最主要的是记录下我的实践经历,同时给需要帮助的人一点点提示。我并不认为我写的代码多么的好,所以你既不用恭维也不用讽刺,相信未来我的代码世界会越来越丰富,希望大家一起努力。而我近期也会分享另一个项目。是一个音乐电台的应用。如果说电子书是享受眼睛的,那么下一个电台应用就是给耳朵用的。敬请期待!


0 0
原创粉丝点击