Android使用PDFDocument导出Canvas绘制的Vector Drawable到PDF画质不稳定
问题根因
你遇到的图标画质不稳定问题本质是VectorDrawable的默认缓存机制和PDFDocument的Canvas密度不匹配导致的:
- VectorDrawable默认开启位图缓存,会提前将矢量图形渲染为适配当前设备屏幕密度的位图存储
- PDFDocument生成的Canvas默认密度通常为160dpi,远低于普通手机屏幕密度,当预渲染的缓存位图拉伸到PDF中需要的绘制尺寸时,就会出现锯齿、模糊;如果刚好缓存的密度和当前绘制尺寸匹配,画质就会表现正常,这就是画质时好时坏的根本原因。
可行解决方案
方案1:绘制前关闭VectorDrawable缓存(优先尝试,改造成本最低)
绘制图标前禁用Drawable的缓存,让矢量图每次都直接通过矢量路径渲染到Canvas,不会用到预生成的低清位图缓存:
// 关闭矢量图缓存 iconActivity.setAllowCaching(false); // 兼容低版本系统可以用VectorDrawableCompat // VectorDrawableCompat.setAllowCaching(iconActivity, false); iconActivity.setBounds(leftMargin,iconActivityTopMargin,iconActivityRightBound,iconActivityBottomBound); iconActivity.draw(canvas);
方案2:手动调高PDF Canvas的密度
创建PDF页面后,手动给Canvas设置更高的密度,匹配你实际需要的绘制精度:
PDFDocument document = new PDFDocument(); // 页面尺寸单位是磅(1/72英寸),按需设置 PDFDocument.PageInfo pageInfo = new PDFDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create(); PDFDocument.Page page = document.startPage(pageInfo); Canvas canvas = page.getCanvas(); // 调整密度值到你需要的精度,比如320/480/640均可 canvas.setDensity(480);
方案3:直接渲染矢量路径(最高清晰度)
如果需要完全规避光栅化,保证PDF中的图标是纯矢量格式,可以将VectorDrawable的路径解析后直接绘制到Canvas,完全绕开缓存逻辑。
内容的提问来源于stack exchange,提问作者Dinh Quang Tuan
相关产品推荐
相关产品推荐

