PDF阅读器系列之--MuPDF源码分析过程(二)

博客找回来了,在那更新 http://blog.csdn.net/sky_pjf

时间好快,又一周过了,发现自己太忙了,博客都没去管……

*MuPDF开源框架现在一直都在维护,我一般都会隔一周就去官网看看有没有更新,因为我想看看他们的工程师们是否即将推出阅读PDF除外的格式文件,这对我目前的项目来说也会节省一些时间。
*好了,话不多说,直接进入重要环节—–分析源码

分析

初看项目工程目录结构,不是很多,直接看类的字面意思均可以得出一些浅显易懂的知识点

1.看清单文件得出来有4个activity

在ChooseActivity中,添加了多个intent-filter意图过滤器,其作用就是规定一些格式文件,一些支持的类型

2.进入src中
tip :项目代码中大量运用枚举

ChoosePDFActivity是程序的主界面,分类型,是文件夹是就进行打开,pdf就跳转等待结果
ChoosePDFAdapter是加载sd卡文件信息,3中type:上一层,文件夹,文件
MuPDFReflowView继承WebView
MuPDFCore 是声明本地方法并加载so的类:功能用c实现

/* The core rendering instance */
enum TopBarMode {Main, Search, Annot, Delete, More, Accept};
enum AcceptMode {Highlight, Underline, StrikeOut, Ink, CopyText};
3.再看xml

布局文件在 buttons.xml下,采用的是ViewAnimator(视图切换)

draw的逻辑分析

draw相关的类
MuPDFActivity   MuPDFReaderView   ReaderView   PageView  MuPDFPageView

充分利用 ctrl+shift +F 查找你想要的信息

//墨迹Ink 绘制按钮
public void OnInkButtonClick(View v) {
   mTopBarMode = TopBarMode.Accept;
   mTopBarSwitcher.setDisplayedChild(mTopBarMode.ordinal());
   mAcceptMode = AcceptMode.Ink;
   mDocView.setMode(MuPDFReaderView.Mode.Drawing);
   mAnnotTypeText.setText(R.string.ink);
   showInfo(getString(R.string.draw_annotation));
}

在源PDF文件上绘制图层,找到触发绘制的事件,追踪绘制的逻辑

MuPDFActivity MuPDFReaderView ReaderView PageView MuPDFPageView

Point类: Point holds two integer coordinates

MuPDFPageView继承PageView

在MuPDFReaderView中
touch事件
touch_start touch_move
在方法中都使用MuPDFView,实现MuPDFView接口,中startDraw continueDraw方法

有个问题:当状态为 Drawing时,双手可以进行缩放

Annot 是Annotation的缩写:代表注释状态
总结如下:
1.mupdfdemo他核心代码是用本地C写的,java调用在MuPDFCore类中
2.几个重要的类分别是
MuPDFActivity控制相关按钮事件
PageView中绘制相关
MuPDFView 继承PageView
reflow 跟重排版文档相关
print 跟打印相关
ordinary 回到TopBarMode.main类型

重点分析MuPDFActivity.java

//注释  点击已绘制区域,可删除
    public void OnDeleteButtonClick(View v) {
        MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
        if (pageView != null)
            pageView.deleteSelectedAnnotation();
        LogUtils.d(TAG, "OnDeleteButtonClick: ");
        mTopBarMode = TopBarMode.Annot;
        mTopBarSwitcher.setDisplayedChild(mTopBarMode.ordinal());
    }

    //注释  点击已绘制区域,可返回
    public void OnCancelDeleteButtonClick(View v) {
        MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
        if (pageView != null)
            pageView.deselectAnnotation();
        LogUtils.d(TAG, "OnCancelDeleteButtonClick: ");
        mTopBarMode = TopBarMode.Annot;
        mTopBarSwitcher.setDisplayedChild(mTopBarMode.ordinal());
    }
思路

触摸PDF view 执行的一些事件
ReaderView.java
1。点击屏幕中央:

2.点击屏幕左边或者右边:

2016年2月29日16:05:53
先实现 绘制页面,添加几个按钮:前进,撤销,颜色选择;

实现结果就是在相应模式下面点击新增按钮实现不同的效果

一、实现绘制回退功能
需求:点击画笔之后绘制一笔后,点击此按钮,能够撤销操作

1.

二、实现绘制前进功能(待议)
需求:在撤销操作后,点击此按钮,能够前进操作
三、实现画笔颜色选择功能
需求:选择你想要的画笔颜色,能够绘制不同颜色的笔迹

1.popuwindow

难点:目前mupdf的 绘制功能在pageview中
代码:

//注释  绘制墨迹
if (mDrawing != null) {
   LogUtils.d(TAG,"paint的绘制");
   Path path = new Path();
   PointF p;

   paint.setAntiAlias(true);
   paint.setDither(true);
   paint.setStrokeJoin(Paint.Join.ROUND);
   paint.setStrokeCap(Paint.Cap.ROUND);

   paint.setStyle(Paint.Style.FILL);
   paint.setStrokeWidth(INK_THICKNESS * scale);
   paint
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值