Android BlurView适配SKCanvasView问题求助:模糊内容出现缩放偏移
Android BlurView 适配 SKCanvasView 缩放偏移问题解决方案
问题背景
基于Dimezis/BlurView实现的BlurView,通过视图树预绘制事件将目标视图绘制到内部Bitmap,模糊后再渲染到自身Canvas,对标准Android视图效果正常,但处理基于Skia的SKCanvasView时,其绘制内容会出现缩放与偏移异常。
核心原因
SKCanvasView的绘制依赖Skia引擎,自身带有独立的矩阵变换(缩放、平移等),而原BlurView的绘制逻辑仅适配Android原生View的坐标体系,未处理SKCanvasView的额外变换,导致绘制到Bitmap时坐标映射错误。
解决方案
1. 修正坐标与矩阵变换
在将SKCanvasView绘制到内部Bitmap前,抵消其自身的变换矩阵,确保绘制内容的坐标与原生View一致:
// 在BlurView绘制目标视图的逻辑中,针对SKCanvasView做特殊处理 if (targetView is SKCanvasView) { val canvas = internalBitmapCanvas val skViewMatrix = targetView.matrix val inverseMatrix = Matrix() // 计算逆矩阵,抵消SKCanvasView的变换 if (skViewMatrix.invert(inverseMatrix)) { canvas.save() canvas.concat(inverseMatrix) targetView.draw(canvas) canvas.restore() } else { // 矩阵不可逆时,采用默认绘制 targetView.draw(canvas) } } else { // 标准视图按原有逻辑绘制 targetView.draw(internalBitmapCanvas) }
2. 同步绘制时机
SKCanvasView的绘制流程可能与原生View不同步,仅依赖视图树预绘制事件可能无法捕获其最新绘制内容,需监听SKCanvasView的绘制完成事件:
// 给SKCanvasView添加绘制监听 skCanvasView.addOnDrawListener { canvas -> // 触发BlurView重新模糊绘制 blurView.invalidate() }
3. 适配视图位置映射
若上述方法仍有偏移,可通过View的全局坐标修正绘制位置:
val location = IntArray(2) targetView.getLocationOnScreen(location) val canvas = internalBitmapCanvas // 平移Canvas到目标视图的全局位置 canvas.save() canvas.translate(-location[0].toFloat(), -location[1].toFloat()) targetView.draw(canvas) canvas.restore()
验证方式
对比模糊后的SKCanvasView内容与原视图,确保红色圆形的位置、大小与原视图完全匹配,无缩放偏移。
内容的提问来源于stack exchange,提问作者Jared Allen
相关产品推荐
相关产品推荐

