FBReader 判断一本书的最后一页

作者: 小白猿 | 来源:发表于2017-12-01 11:00 被阅读61次

    前言

    公司大佬使用HS项目之后提出了一些优化,其中有翻看到一本书的最后一页的时候,应给给与给予提示,参看了一些其他阅读类的app,也有很多不给提示,但是都在阅读器底部标明了页数,但是HS项目中并未这样标识,可能是由于FB的分页并不准确,所以寻找代码中的解决思路

    寻找过程

    翻看了一下HS项目引用的HSReader项目,以及杜小哥的一些注释,返现关于章节的判断方法比较多,但是关于页的方法几乎没有,或者很少,大多都是页面的绘制,也可能是我找的不仔细

    偶然发现

    通过翻章的方法一层一层往上回溯,找到了一个方法

    @Override
        public boolean canScroll(PageIndex index) {
            switch (index) {
                default:
                    return true;
                case next: {
                    final ZLTextWordCursor cursor = getEndCursor();
                    return cursor != null && !cursor.isNull() && !cursor.isEndOfText();
                }
                case previous: {
                    final ZLTextWordCursor cursor = getStartCursor();
                    return cursor != null && !cursor.isNull() && !cursor.isStartOfText();
                }
            }
        }
    

    其中参数PageIndex的枚举类型是这样定义的

    public static enum PageIndex {
            previous, current, next;
    
            public PageIndex getNext() {
                switch (this) {
                    case previous:
                        return current;
                    case current:
                        return next;
                    default:
                        return null;
                }
            }
    
            public PageIndex getPrevious() {
                switch (this) {
                    case next:
                        return current;
                    case current:
                        return previous;
                    default:
                        return null;
                }
            }
        }
    

    代码解析

    简单理解为是通过一个游标,

    • 当我们传入当current应该是的当前页面,默认是可以滚动的,返回true
    • 当传入previous,判断游标是不是到了一本书的最前面,如果不是,则返回true意思是可以滚动,反之返回false,不可以滚动
    • 当传入next,正好和previos是相反的,判断游标是不是到了一本书的最后面,如果不是,则返回true意思是可以滚动,反之返回false,不可以滚动

    与HS项目融合

    • 调用时机
      需要在每次翻页的时候进行判断,恰好在HS项目中有此方法
    protected void dispatchAction(Message message) 
    

    传入的参数是PageIndex. next,当翻到最后一页的时候,会返回false,然后根据这一标志位做相应操作,比如toast或者dialog

    • 问题:在HS项目中会有从别的入口直接到达某一页的操作,由于不是手动翻页过去的,所以dispatchAction肯定是不会被调用,所以此时应该在相应跳转方法的实现中也要再次调用一次判断canScroll

    相关文章

      网友评论

        本文标题:FBReader 判断一本书的最后一页

        本文链接:https://www.haomeiwen.com/subject/ycyibxtx.html