You need to enable JavaScript to run this app. 如何在barteksc/AndroidPdfViewer中实现OnDrawAll及控制onDraw开关
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:06:00