前言
公司大佬使用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
- 完
网友评论