Partial invalidation in custom Android view with hardware acceleration
I've got a custom View in my application which fills the entire activity.
In most cases, when I want to refresh the control I call invalidate()
without any parameters.
However, in certain circumstances, where I'm only changing a small area of the control, I call invalidate(Rect)
to avoid redrawing the entire screen. This is important because in these situations I
need the update to be as fast as possible.
This seems to work fine, however, when I enable hardware acceleration in Honeycomb (i.e. set android:hardwareAccelerated="true"
in AndroidManifest.xml), the partial redraw does not seem to work.
This can be seen if I do Log.d("FOO", canvas.getClipBounds())
in my onDraw()
method; the output simply shows that the whole control is being updated,开发者_如何学运维 whereas with hardware acceleration disabled, I get the correct region being output.
Is there any way to make partial invalidation work when using hardware acceleraton?
Many thanks, Matt
Partial redraw works just fine, only the specified region of the screen will get redrawn. What it won't do however is change the clip bounds on the Canvas. All the drawing operations will be recorded but only the ones intersecting with the dirty region will actually be executed.
Update: as of Lollipop (API 21), partial invalidation happens at the View level (i.e. you cannot invalidate less than an entire View).
When HA is enabled, the rendering pipeline will use DisplayList
to store the drawing commands. Even if you specify the dirty region in View.invalidate
, the whole displaylist will be rebuilt (just think that how can we only update a small set of DisplayList, that's impossible right?). Eventually, as @Romain
says, only the real dirty region will be redrawn.
精彩评论