summaryrefslogtreecommitdiffstats
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
parent171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3 (diff)
downloadframeworks_base-b7ba1220a3dc3012d2e22825eaeb0e643333f5a4.zip
frameworks_base-b7ba1220a3dc3012d2e22825eaeb0e643333f5a4.tar.gz
frameworks_base-b7ba1220a3dc3012d2e22825eaeb0e643333f5a4.tar.bz2
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
-rw-r--r--core/java/android/widget/ImageView.java22
-rw-r--r--graphics/java/android/graphics/drawable/BitmapDrawable.java3
2 files changed, 23 insertions, 2 deletions
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index a1582f2..a1e6cc8 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) {
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index fcd7f63..cf91be1 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -219,7 +219,8 @@ public class BitmapDrawable extends Drawable {
}
}
- private void setBitmap(Bitmap bitmap) {
+ /** @hide */
+ protected void setBitmap(Bitmap bitmap) {
if (mBitmapState.mBitmap != bitmap) {
mBitmapState.mBitmap = bitmap;
computeBitmapSize();