关于barteksc/PdfiumAndroid
barteksc/PdfiumAndroid 这个源码被,引用的次数是比较高的,flutter的几个pdf库也是引用它.它使用福昕的开源sdk.福昕阅读器我早期的时候用,交互一般,渲染也不如mupdf,有些pdf中文显示不了,体积小点.
barteksc/PdfiumAndroid已经是一个完善的sdk了,不去作什么修改,这里分析一下它的工作原理就行.与vudroid的模式略有差别.但大道是相通的.分块渲染.
PDFView
入口是PDFView,它提供了build模式来构造.
PDFView.this.setSwipeEnabled(enableSwipe);
PDFView.this.setNightMode(nightMode);
PDFView.this.enableDoubletap(enableDoubletap);
PDFView.this.setDefaultPage(defaultPage);
PDFView.this.setSwipeVertical(!swipeHorizontal);
PDFView.this.enableAnnotationRendering(annotationRendering);
PDFView.this.setScrollHandle(scrollHandle);
PDFView.this.enableAntialiasing(antialiasing);
PDFView.this.setSpacing(spacing);
PDFView.this.setAutoSpacing(autoSpacing);
PDFView.this.setPageFitPolicy(pageFitPolicy);
PDFView.this.setFitEachPage(fitEachPage);
PDFView.this.setPageSnap(pageSnap);
PDFView.this.setPageFling(pageFling);
这要功能是这些,垂直与水平滚动,双击放大,页面间距,页面的适配屏幕
共1564行,它的特点是支持rgb565,与argb8888.而mupdf源码编译的只支持argb8888,如果想支持565要自己修改了.
private void load(DocumentSource docSource, String password, int[] userPages) {if (!recycled) {throw new IllegalStateException("Don't call load on a PDF View without recycling it first.");}recycled = false;// Start decoding documentdecodingAsyncTask = new DecodingAsyncTask(docSource, password, userPages, this, pdfiumCore);decodingAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);}
这是入口方法,加载文档.加载完进入loadComplete
void loadComplete(PdfFile pdfFile) {state = State.LOADED;this.pdfFile = pdfFile;if (!renderingHandlerThread.isAlive()) {renderingHandlerThread.start();}renderingHandler = new RenderingHandler(renderingHandlerThread.getLooper(), this);renderingHandler.start();if (scrollHandle != null) {scrollHandle.setupLayout(this);isScrollHandleInit = true;}dragPinchM