为什么partial invalidate会跨越整个View?

Why does partial invalidate span the entire View?

我正在尝试使 android 视图部分无效。我使用 View.invalidate( l, t, b, r ) 它似乎正确地使垂直(顶部和底部)值无效,但是,无论我使用哪个左右值,它都会使整个视图无效。

例如,我的视图是灰色的。我希望使绿色区域无效,但是,它会使绿色和红色区域无效。它总是跨越整个视图的整个水平方向。我试图输入较小的值,例如 View.invalidate( 0, 0, 50, 50 ),它仍然会导致此行为。

Image Link (not enough rep to post images)

为什么会这样?

行为随硬件加速而改变,Honeycomb 之后的默认行为。现在,当您 invalidate() 提供脏区域的视图时,未设置剪辑绑定 (canvas.getClipBounds())。但是,只有与脏区域相交的对象才会被重绘。

参考 this 渲染管线作者 Romain Guy 的回答。