Matt Holgate
Matt Holgate

Reputation: 573

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

Upvotes: 11

Views: 4218

Answers (2)

Romain Guy
Romain Guy

Reputation: 98501

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).

Upvotes: 15

suitianshi
suitianshi

Reputation: 3340

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.

Upvotes: 1

Related Questions