You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:24:31