制作安卓PDF阅读器:一、页面的显示与触控

2020-10-24  本文已影响0人  天下第九九八十一

Subsampling-scale-iamge-view 是一个接近于快图的大图解析控件,他的思想同样可以运用在PDF阅读器上面,可以同时处理PDF页面的显示和触控。

一、连续渲染缩略图

用多线程连续渲染缩略图,其中两张高清(缩放比~0.5),其余低清(0.1)。

用 Subsampling-scale-iamge-view 处理手势操作以及页面绘制。原理是将整本PDF书籍当作一张超级大图。可以看到图中的“大图”尺寸是3480x3070842。暂时不考虑整型溢出(int > 2147483647 or long > 9223372036854775807可见int还是很容易溢出的)。。。

触摸操作。双击放大,可有两级。双击第二击按住不放拖动,则进行单指缩放。

与快图不同,只有检测到 ACTION_UP 而不是 POINTER_UP 时,才会归位,所以可以两指交替不断地移动页面位置。

二、渲染高清铺块。

借鉴 AndroidPdfViewer, 所谓铺块(Tiles)其实是一个PDF页面的一小部分,在屏幕空间固定大小(256x256)。将许多这样的铺块覆盖绘制于缩略图上面,达成整屏渲染高清PDF的效果。

需要有多少个铺块呢?从左上角开始一个个铺砌,如果设备屏幕能被axb个铺块完全覆盖,那么按理说需要(a+1)*(b+1)个铺块就足够了,但由于我们采用连续的页面渲染,页面之间有缝隙,而缝隙处的铺块像素只有一部分有效,所以需要的数量可能比理论值大(a+1)*n个,n为当前屏幕显示的页面缝隙数量。


铺块图示。需要的数量,计算值为6*8=48,但处于页面缝隙之间的铺块,红色部分的像素完全被“浪费”掉了,不计入铺砌面积,故实际需要48+6*1=36+18=54个。

三、处理不同的页面大小

PDF的各个页面可以有不同的尺寸大小。为了处理这样的情况,必须引入更加复杂的逻辑。

所有页面的尺寸已在初始化时读取完毕。需要在这个基础上为所有页面整体计算并应用一个初始的缩放值。( 参考 AndroidPdfViewer、Acrobat 的处理方法 )

上一篇下一篇

猜你喜欢

热点阅读