制作安卓PDF阅读器:一、页面的显示与触控
Subsampling-scale-iamge-view 是一个接近于快图的大图解析控件,他的思想同样可以运用在PDF阅读器上面,可以同时处理PDF页面的显示和触控。
一、连续渲染缩略图
用多线程连续渲染缩略图,其中两张高清(缩放比~0.5),其余低清(0.1)。
![](https://img.haomeiwen.com/i2253897/9c0ffc21a4e4124c.gif)
用 Subsampling-scale-iamge-view 处理手势操作以及页面绘制。原理是将整本PDF书籍当作一张超级大图。可以看到图中的“大图”尺寸是3480x3070842。暂时不考虑整型溢出(int > 2147483647
or long > 9223372036854775807
可见int还是很容易溢出的)。。。
![](https://img.haomeiwen.com/i2253897/a6a4a4c9cf16701b.gif)
触摸操作。双击放大,可有两级。双击第二击按住不放拖动,则进行单指缩放。
与快图不同,只有检测到 ACTION_UP 而不是 POINTER_UP 时,才会归位,所以可以两指交替不断地移动页面位置。
二、渲染高清铺块。
借鉴 AndroidPdfViewer, 所谓铺块(Tiles)其实是一个PDF页面的一小部分,在屏幕空间固定大小(256x256)。将许多这样的铺块覆盖绘制于缩略图上面,达成整屏渲染高清PDF的效果。
需要有多少个铺块呢?从左上角开始一个个铺砌,如果设备屏幕能被axb个铺块完全覆盖,那么按理说需要(a+1)*(b+1)个铺块就足够了,但由于我们采用连续的页面渲染,页面之间有缝隙,而缝隙处的铺块像素只有一部分有效,所以需要的数量可能比理论值大(a+1)*n个,n为当前屏幕显示的页面缝隙数量。
![](https://img.haomeiwen.com/i2253897/80ecef97dd4174ca.png)
三、处理不同的页面大小
PDF的各个页面可以有不同的尺寸大小。为了处理这样的情况,必须引入更加复杂的逻辑。
所有页面的尺寸已在初始化时读取完毕。需要在这个基础上为所有页面整体计算并应用一个初始的缩放值。( 参考 AndroidPdfViewer、Acrobat 的处理方法 )