——支持html、txt、epub、fb2、css
FBReaderJ流程(代码层面):
一.ZLAndroidWidget被程序的入口FBReader类所加载,ZLAndroidWidget继承自View,在重载View的onDraw()方法时实例化了ZLAndroidActivity类。
1. ZLAndroidActivity是继承自Activity的管理抽象类,它预留了fileFromIntent()、createApplication()抽象方法供子类FBReaderApp实现。
2. 在ZLAndroidActivity的onCreate()方法内封装了文件的打开动作(具体实现逻辑由子类FBReader重载createApplication()方法中生成FBReaderApp类(重载父类ZLApplication的initWindow() 方法)引入解压、载入、解析电子书的流程)。
3. FBReaderAPP是ZLApplication的子类。ZLApplication同样是一个管理抽象类。
它提供openFile()抽象方法让子类实现。因为View在绘制的时候,数据是后到的,所以就留了一个口。
4. 在FBReaderApp做initWindow()操作的时候首先通过路径获取到ZLFile对象·通过ZLFile对象生成Book对象。然后在openBookInternal()方法中调用 BookModel.createModel()方法,通过NativeFormatPlugin的中转,将生成的生成的Book对象传给c++中的BookReader类生成BookModel对象再传回java层。然后将BookModel对象传给了FBView,FBView完成了大部分的视图绘制工作。
5. FBView的父类ZLTextView在重载paint()的方法时主要做了以下操作:
⑴ 获取壁纸,如果没有,则获取背景颜色;
⑵ 获取当前页面MyCurrentPage;
⑶ 计算页面的信息,获取页面行的信息;
⑷ 计算每一行的具体的数值;
⑸ 画出每一行(包括绘制长按后在文字两侧的选择箭头)。
6. ZLTextView中的buildInfos()方法构建整个ZLTextPage页面中的信息。
7. ZLTextPage(文本页面类),在其内部有变量 ArrayList<ZLTextLineInfo>类型的 LineInfos 容纳各行信息,ZLTextLineInfo类 包含每行的字符或者图片信息,通过这种结构,将每页所有的信息包含其中。
8. style包采用了装饰模式来组织一系列的文本风格类。并通过ZLTextStyleCollection类读取assets/default/styles.xml中定义好的style定义, 该包中的类最终在ZLTextView类的applyControl()方法中被使用。
9. BitmapManager类(显示页面的管理类),通过myBitmaps变量维持内存中至多两份Bitmap。
通过myBitmaps和myIndexes的同步来完成 “前页”,“当前页”,“后页”的换屏逻辑。
注:在 NativeFormatPlugin中转生成BookModel对象时,acceptsFile()、readMetaInfo()、readModel()、readCover()这几个方法调用的是c++中的实现。而 readAnnotation() 则调用的是 PluginCollection类中的 java 的实现。
二.ZLAndroidWidget引入了ZLViewWidget接口,实现了ZLViewWidget的reset()、repaint()、startManualScrolling()和scrollManuallyTo()方法。
三.ZLAndroidWidget引入了View.OnLongClickListener接口去处理视图内的长按事件,在onTouchEvent()方法内,手指按下时尝试延迟发送LongClickRunnable,如果该LongClickRunnable对象没有在手指抬起前被取消,则myLongClickPerformed变量为true,则在MotionEvent.ACTION_UP分支,触发FBView类的onFingerReleaseAfterLongPress()方法。而onFingerReleaseAfterLongPress()方法主要处理对图片的长按响应。
转载地址:http://www.sixreader.com/bbs/forum.php?mod=viewthread&tid=46&extra=&page=1