使用muPDF卷曲/翻转效果

时间:2015-06-16 04:16:51

标签: android opengl-es flip mupdf page-curl

我正在使用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());

CurlViewGLSurfaceView延伸并实现View.OnTouchListener, CurlRenderer.Observer

但是在muPDF中如果我没有弄错的话,数据在core对象中。 coreMuPDFCore的实例。并像这样使用它:

MuPDFReaderView mDocView;
MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
mDocView.setAdapter(new MuPDFPageAdapter(this, this, core));

MuPDFReaderView延伸ReaderViewReaderView延伸AdapterView<Adapter>并实施GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, Runnable

我的问题是如何在muPDF中使用curl效果?我应该在哪里逐页获取页面并将其转换为位图?然后将muPDF中适配器的各个方面更改为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。它的开发人员说“ An additional module允许在FBReader中打开PDF文件。基于radaee pdf库。

我很困惑!因为radaeepdf是封闭源,downloadable project仅用于演示,插入的用户名和密码用于此包。 人们希望改变整个fbreader项目,如包名。

令我困惑的另一个问题是这个额外的模块源代码在哪里?!

无论如何,如果有人想帮助我,那么fbreader已经做得很好。

修改

我与开发muPDF(或其中一位开发人员)的Robin Watts谈过,他说:

  

你读过platform / android / ClassStructure.txt吗? MuPDF是   主要是C库。因此标准API是C语言。宁   而不是像Java那样公开api(这将是   最好的解决方案,以及我做过一些工作的东西,但有   由于时间不够而未完成,我们已经实施了MuPDFCore   总结我们需要的部分。 MuPDFCore处理打开PDF文件,   并从中获取位图以在视图中使用。或者更确切地说,MuPDFCore   返回'views',而不是'bitmaps'。如果你需要位图,那么你就要去了   需要在MuPDFCore中进行更改。

更改MuPDFReaderView类的一小部分时有太多错误。我有点迷惑不解了!这些是彼此相关的。

请更准确地回答。

修改

赏金已过期。

2 个答案:

答案 0 :(得分:2)

如果muPDF不支持渲染到位图,除了渲染到常规视图并将屏幕转储转换为如下位图之外别无选择:

View content = findViewById(R.id.yourPdfView);
Bitmap bitmap = content.getDrawingCache();

然后使用此位图作为其他库的输入。

答案 1 :(得分:1)

  

我应该在哪里逐页获取页面并将其转换为位图?

在我们的应用程序(报纸应用程序)中,我们使用MuPDF来呈现PDF。 工作流程如下:

  1. 下载PDF文件(每个报纸页面有一个PDF)
  2. 使用MuPDF渲染
  3. 将位图保存到文件系统
  4. 将位图从文件系统加载为视图
  5. 所以,最后,我们使用的是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包装在一个新的Thread中并启动它。因此,将调用RenderTask的run方法:

    @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.。)我认为没有必要发布代码如何将位图设置为视图的背景