summaryrefslogtreecommitdiff
path: root/core/java/android/widget/ImageView.java
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2015-07-09 17:37:34 -0700
committerJohn Reck <jreck@google.com>2015-07-09 17:40:41 -0700
commitb7ba1220a3dc3012d2e22825eaeb0e643333f5a4 (patch)
treeab3d320793ed3a3f268a955b88630cb988a575f7 /core/java/android/widget/ImageView.java
parent171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3 (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.java22
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) {