使用具有卷曲/翻转效果的 muPDF
Posted
技术标签:
【中文标题】使用具有卷曲/翻转效果的 muPDF【英文标题】:Using muPDF with curl/flip effect 【发布时间】:2015-08-31 17:55:22 【问题描述】:我正在使用muPDF 在我的应用程序中阅读 PDF。我不喜欢它的默认动画(水平切换)。另一方面,我发现 this 用于图像卷曲效果的辉煌库,以及用于布局翻转效果的 this 项目。
在 curl 示例项目中,CurlActivity
中的所有数据都是图像,并在PageProvider
中设置如下:
private class PageProvider implements CurlView.PageProvider
// Bitmap resources.
private int[] mBitmapIds = R.drawable.image1, R.drawable.image2,
R.drawable.image3, R.drawable.image4;
并像这样使用它:
private CurlView mCurlView;
mCurlView = (CurlView) findViewById(R.id.curl);
mCurlView.setPageProvider(new PageProvider());
而CurlView
扩展自GLSurfaceView
并实现View.OnTouchListener, CurlRenderer.Observer
但如果我没记错的话,在 muPDF 中,数据位于 core
对象中。 core
是 MuPDFCore
的实例。并像这样使用它:
MuPDFReaderView mDocView;
MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
mDocView.setAdapter(new MuPDFPageAdapter(this, this, core));
MuPDFReaderView
扩展 ReaderView
和 ReaderView
扩展 AdapterView<Adapter>
并实现 GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, Runnable
。
我的问题是如何在 muPDF 中使用卷曲效果?我应该在哪里一页一页地获取页面并将它们转换为位图?然后将 muPDF 中的 Adapter 的各个方面更改为 CurlView。
在翻盖示例项目中,在FlipHorizontalLayoutActivity
(我也喜欢这种效果)中,我们有这些:
private FlipViewController flipView;
flipView = new FlipViewController(this, FlipViewController.HORIZONTAL);
flipView.setAdapter(new TravelAdapter(this));
setContentView(flipView);
而FlipViewController
扩展了AdapterView<Adapter>
,而TravelAdapter
中的数据集扩展了BaseAdapter
。
以前没有人这样做过吗?或者可以帮我做吗?!
编辑:
我发现了另一个不错的带有卷曲效果的开源 PDF 阅读器,名为 fbreaderJ。它的开发者说“一个允许在 FBReader 中打开 PDF 文件的additional module。基于 radaee pdf 库。”
我糊涂了!因为radaeepdf 是封闭源代码,downloadable project 仅用于演示,插入的用户名和密码用于此包。 人们想要更改整个 fbreader 项目,例如包名。
另一个让我困惑的问题是这个附加模块源代码在哪里?!
不管怎样,如果有人想帮助我,fbreader 已经做得很好了。
编辑:
我与开发 muPDF(或其中一位开发人员)的 Robin Watts 进行了交谈,他说:
你读过 platform/android/ClassStructure.txt 吗? MuPDF 是 主要是一个 C 库。因此,标准 api 是 C 的。相当 而不是将 API 完全按原样暴露给 Java(这将是 最好的解决方案,我已经做了一些工作,但是有 由于时间不够,没有完成),我们已经实现了 MuPDFCore 总结我们需要的部分。 MuPDFCore 处理打开 PDF 文件, 并从中获取位图以在视图中使用。或者更确切地说,MuPDFCore 返回“视图”,而不是“位图”。如果你需要位图,那你就去 需要在 MuPDFCore 中进行更改。
更改 MuPDFReaderView 类的一小部分时错误太多。我有点迷惑不解了!这些是相互关联的。
请准确回答。
编辑:
赏金已过期。
【问题讨论】:
你有什么解决办法吗? @AnandSavjani 我没有测试选中的答案,但它似乎有效。 【参考方案1】:如果 muPDF 不支持渲染到位图,您别无选择,只能渲染到常规视图并将屏幕转储到位图,如下所示:
View content = findViewById(R.id.yourPdfView);
Bitmap bitmap = content.getDrawingCache();
然后将此位图用作其他库的输入。
【讨论】:
谢谢 DKIT,我知道如何将视图转换为位图,但我想要更详细的答案。请查看已编辑的问题。【参考方案2】:我应该从哪里获取页面并将它们转换为位图?
在我们的应用程序(报纸应用程序)中,我们使用 MuPDF 来呈现 PDF。 工作流程如下:
-
下载 PDF 文件(我们每个报纸页面有一个 PDF)
使用 MuPDF 进行渲染
将位图保存到文件系统
将位图从文件系统作为背景图像加载到视图中
所以,最后,我们使用的是 MuPDFCore.java 及其方法 drawPage(...) 和 onDestroy()
这是你想知道的还是我没抓住重点?
编辑
1.) 我认为没有必要发布如何下载文件的代码。但是在下载之后,我将一个 RenderTask(从 Runnable 扩展)添加到一个 Renderqueue 并触发该队列。 RenderTask 需要一些渲染信息:
/**
* constructs a new RenderTask instance
* @param context: you need Context for MuPdfCore instance
* @param pageNumber
* @param pathToPdf
* @param renderCallback: callback to set bitmap to the view after
* rendering
* @param heightOfRenderedBitmap: this is the target height
* @param widthOfRenderedBitmap: this is the target width
*/
public RenderTask (Context context, Integer pageNumber, String pathToPdf, IRenderCallback,
renderCallback, int heightOfRenderedBitmap,
int widthOfRenderedBitmap)
//store things in fields
2.) + 3.) Renderqueue 将 RenderTask 包装在一个新线程中并启动它。所以会调用 RenderTask 的运行方法:
@Override
public void run ()
//do not render it if file exists
if (exists () == true)
finish();
return;
Bitmap bitmap = render();
//if something went wrong, we can't store the bitmap
if (bitmap == null)
finish();
return;
//now save the bitmap
// in my case i save the destination path in a String field
imagePath = save(bitmap, new File("path/to/your/destination/folder/" + pageNumber + ".jpg"));
bitmap.recycle();
finish();
/**
* let's trigger the callback
*/
private void finish ()
if (renderCallback != null)
// i send the whole Rendertask to callback
// maybe in your case it is enough to send the pageNumber or path to
// renderend bitmap
renderCallback.finished(this);
/**
* renders a bitmap
* @return
*/
private Bitmap render()
MuPDFCore core = null;
try
core = new MuPDFCore(context, pathToPdf);
catch (Exception e)
return null;
Bitmap bm = Bitmap.createBitmap(widthOfRenderedBitmap, heightOfRenderedBitmap, Config.ARGB_8888);
// here you render the WHOLE pdf cause patch-x/-y == 0
core.drawPage(bm, 0, widthOfRenderedBitmap, heightOfRenderedBitmap, 0, 0, widthOfRenderedBitmap, heightOfRenderedBitmap, core.new Cookie());
core.onDestroy();
core = null;
return bm;
/**
* saves bitmap to filesystem
* @param bitmap
* @param image
* @return
*/
private String save(Bitmap bitmap, File image)
FileOutputStream out = null;
try
out = new FileOutputStream(image.getAbsolutePath());
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
return image.getAbsolutePath();
catch (Exception e)
return null;
finally
try
if (out != null)
out.close();
catch(Throwable ignore)
4.) 我认为没有必要发布如何将位图设置为视图背景的代码
【讨论】:
我现在太忙了,但我会测试一下。无论如何,如果有一个示例项目,那就太好了:/。谢谢。以上是关于使用具有卷曲/翻转效果的 muPDF的主要内容,如果未能解决你的问题,请参考以下文章
IOS - UIPageViewController 使用页面卷曲效果转到上一页并在每个页面上显示页码