如何在barteksc/AndroidPdfViewer中实现OnDrawAll及控制onDraw开关
barteksc/AndroidPdfViewer OnDrawAll实现及onDraw启用禁用方案
一、OnDrawAll方法具体实现
OnDrawAll是barteksc/AndroidPdfViewer提供的全局绘制监听接口,会在所有PDF页面内容渲染完成后触发,可用于实现水印、全局标记、自定义遮罩等功能,实现步骤如下:
- 首先在PDF初始化配置完成后,设置
OnDrawAllListener监听
Kotlin实现示例:
pdfView.setOnDrawAllListener { canvas -> // 此处编写自定义绘制逻辑,示例为添加半透明水印 val paint = Paint().apply { color = Color.parseColor("#33000000") textSize = 90f isAntiAlias = true textAlign = Paint.Align.CENTER } canvas.drawText("内部文档禁止外传", canvas.width / 2f, canvas.height / 2f, paint) }
Java实现示例:
pdfView.setOnDrawAllListener(new OnDrawAllListener() { @Override public void onDrawn(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.parseColor("#33000000")); paint.setTextSize(90f); paint.setAntiAlias(true); paint.setTextAlign(Paint.Align.CENTER); canvas.drawText("内部文档禁止外传", canvas.getWidth()/2f, canvas.getHeight()/2f, paint); } });
注意:OnDrawAll回调会在每次PDF页面滚动、缩放触发重绘时执行,若绘制内容固定可提前初始化Paint对象减少性能损耗
二、onDraw方法启用/禁用方案
2.1 针对barteksc/AndroidPdfViewer实现
组件默认开启原生onDraw渲染逻辑,要自定义开关控制,建议通过继承PDFView自定义子类实现:
- 第一步:自定义PDFView子类,添加开关变量
class ControllablePDFView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : PDFView(context, attrs, defStyleAttr) { // 控制原生onDraw逻辑是否执行的开关,默认开启 var enableNativeOnDraw = true override fun onDraw(canvas: Canvas) { if (enableNativeOnDraw) { // 开关开启时执行原生PDF渲染逻辑 super.onDraw(canvas) } // 此处可添加不受开关控制的自定义绘制内容 } }
- 第二步:业务代码中直接修改开关后触发重绘即可生效
// 禁用原生onDraw,PDF内容将不再渲染 controllablePdfView.enableNativeOnDraw = false // 启用原生onDraw,恢复PDF内容渲染 controllablePdfView.enableNativeOnDraw = true // 调用invalidate触发重绘使开关生效 controllablePdfView.invalidate()
2.2 其他PDF查看器通用实现方案
- 第三方开源PDF查看器:统一逻辑为继承组件提供的渲染View类,重写onDraw方法,添加开关变量控制是否调用父类的
super.onDraw(canvas)方法即可 - 基于系统PdfRenderer的自定义PDF查看View:直接在自定义View的onDraw方法中添加开关,控制是否执行PdfRenderer的页面绘制逻辑即可
注意:禁用原生onDraw后PDF内容不会渲染到画布上,仅适合需要完全自定义绘制内容的场景使用
内容的提问来源于stack exchange,提问作者Dinesh Chavhan
相关产品推荐
相关产品推荐

