diff options
| author | John Reck <jreck@google.com> | 2015-07-09 17:37:34 -0700 |
|---|---|---|
| committer | John Reck <jreck@google.com> | 2015-07-09 17:40:41 -0700 |
| commit | b7ba1220a3dc3012d2e22825eaeb0e643333f5a4 (patch) | |
| tree | ab3d320793ed3a3f268a955b88630cb988a575f7 /core/java/android/widget/ImageView.java | |
| parent | 171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3 (diff) | |
Teach ImageView to recycle internal drawables
Bug: 22289362
It's pretty common for ImageView#setBitmap to be called
repeatedly. Avoid re-creating the BitmapDrawable in this scenario
as that has high object churn of semi-expensive objects like
Paint.
Change-Id: Ib77719cd0366d02c1a42f774850bf3b9caa9c288
Diffstat (limited to 'core/java/android/widget/ImageView.java')
| -rw-r--r-- | core/java/android/widget/ImageView.java | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index a1582f2549b7..a1e6cc8b0510 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -570,6 +570,17 @@ public class ImageView extends View { } } + private static class ImageViewBitmapDrawable extends BitmapDrawable { + public ImageViewBitmapDrawable(Resources res, Bitmap bitmap) { + super(res, bitmap); + } + + @Override + public void setBitmap(Bitmap bitmap) { + super.setBitmap(bitmap); + } + }; + /** * Sets a Bitmap as the content of this ImageView. * @@ -579,7 +590,16 @@ public class ImageView extends View { public void setImageBitmap(Bitmap bm) { // if this is used frequently, may handle bitmaps explicitly // to reduce the intermediate drawable object - setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); + if (mDrawable instanceof ImageViewBitmapDrawable) { + ImageViewBitmapDrawable recycledDrawable = (ImageViewBitmapDrawable) mDrawable; + // Hacky fix to force setImageDrawable to do a full setImageDrawable + // instead of doing an object reference comparison + mDrawable = null; + recycledDrawable.setBitmap(bm); + setImageDrawable(recycledDrawable); + } else { + setImageDrawable(new ImageViewBitmapDrawable(mContext.getResources(), bm)); + } } public void setImageState(int[] state, boolean merge) { |
