How does Android's setDrawingCacheEnabled() work?-ThrowExceptions

Exception or error:

I have a UI where the root layout is a RelativeLayout. It has a number of Views, such as fields, buttons, etc.

There are also two other panels that are initially invisible. When the user clicks a button, one of these panels slides in from the left, another slides in from the bottom. The problem is the frame rate is pathetic on a Nexus S.

I want to use setDrawingCacheEnabled(true) in order to (I hope) speed up the animation of these two panels. As a simplified example, here is roughly how I slide in one of these panels. I’ll call it “detailPanel”.

public class MyActivity extends Activity {
  // Initially invisible.
  private View detailPanel;

  // A simple slide animation.
  private Animation detailEnterAnimation;

  ...

  public void someButtonClicked(View view) {
    detailPanel.startAnimation(detailEnterAnimation);
    detailPanel.setVisibility(View.VISIBLE);
    detailPanel.setDrawingCacheEnabled(true);
  }
}

Now in the DetailPanel I try to use the cache. I was hoping that bitmap rendering via the cache would improve performance:

public class DetailPanel extends LinearLayout {
  public void draw(Canvas canvas) {
    Bitmap cache = getDrawingCache();
    if (cache != null) {
      canvas.drawBitmap(cache, 0, 0, null);
    } else {
      super.draw(canvas);
    }
  }
}

The Bitmap is non-null and is the right size, but it is completely black.

Why is my bitmap black? That code may be obscenely wrong; I’ve tried a million different things and just cannot figure it out.

How to solve:

From Android documentation (http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29):

Enabling the drawing cache is similar to setting a layer when hardware acceleration is turned off. When hardware acceleration is turned on, enabling the drawing cache has no effect on rendering because the system uses a different mechanism for acceleration which ignores the flag. If you want to use a Bitmap for the view, even when hardware acceleration is enabled, see setLayerType(int, android.graphics.Paint) for information on how to enable software and hardware layers.

Maybe this is your case?

###

You may want to build your drawing cache before using it, otherwise It will give you a blank bitmap

  public void someButtonClicked(View view) {
    detailPanel.startAnimation(detailEnterAnimation);
    detailPanel.setVisibility(View.VISIBLE);
    detailPanel.setDrawingCacheEnabled(true);
    detailPanel.buildDrawingCache();  //may be you need to add this?
  }

Leave a Reply

Your email address will not be published. Required fields are marked *