FBReaderJ流程

——支持htmltxtepubfb2css

FBReaderJ流程(代码层面)

一.ZLAndroidWidget被程序的入口FBReader类所加载,ZLAndroidWidget继承自View在重载ViewonDraw()方法时实例化了ZLAndroidActivity

    1. ZLAndroidActivity是继承自Activity的管理抽象类,它预留了fileFromIntent()createApplication()抽象方法供子类FBReaderApp实现。

    2. 在ZLAndroidActivityonCreate()方法内封装了文件的打开动作(具体实现逻辑由子类FBReader重载createApplication()方法中生成FBReaderApp类(重载父类ZLApplicationinitWindow() 方法)引入解压、载入、解析电子书的流程)。

    3. FBReaderAPPZLApplication的子类。ZLApplication同样是一个管理抽象类。

它提供openFile()抽象方法让子类实现。因为View在绘制的时候,数据是后到的,所以就留了一个口。

    4. 在FBReaderAppinitWindow()操作的时候首先通过路径获取到ZLFile对象·通过ZLFile对象生成Book对象。然后在openBookInternal()方法中调用 BookModel.createModel()方法,通过NativeFormatPlugin的中转,将生成的生成的Book对象传给c++中的BookReader生成BookModel对象再传回java。然后将BookModel对象传给了FBViewFBView完成了大部分的视图绘制工作。

    5. FBView的父类ZLTextView在重载paint()方法时主要做了以下操作:

        获取壁纸,如果没有,则获取背景颜色;

        获取当前页面MyCurrentPage

        计算页面的信息,获取页面行的信息;

        计算每一行的具体的数值;

        画出每一行(包括绘制长按后在文字两侧的选择箭头)。

    6. ZLTextView中的buildInfos()方法构建整个ZLTextPage页面中的信息。

    7. ZLTextPage(文本页面类),在其内部有变量 ArrayList类型的 LineInfos 容纳各行信息,ZLTextLineInfo类 包含每行的字符或者图片信息,通过这种结构,将每页所有的信息包含其中。

    8. style包采用了装饰模式来组织一系列的文本风格类。并通过ZLTextStyleCollection类读取assets/default/styles.xml中定义好的style定义, 该包中的类最终在ZLTextView类的applyControl()方法中被使用。

    9. BitmapManager(显示页面的管理类),通过myBitmaps变量维持内存中至多两份Bitmap

通过myBitmapsmyIndexes的同步来完成 前页当前页后页的换屏逻辑。

   注:在 NativeFormatPlugin中转生成BookModel对象时,acceptsFile()、readMetaInfo()、readModel()、readCover()这几个方法调用的是c++中的实现。而 readAnnotation() 则调用的是 PluginCollection类中的 java 的实现

二.ZLAndroidWidget引入了ZLViewWidget接口,实现了ZLViewWidgetreset()、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




你可能感兴趣的:(FBReaderJ流程)