diff options
| author | John Reck <jreck@google.com> | 2015-07-10 10:02:58 -0700 |
|---|---|---|
| committer | John Reck <jreck@google.com> | 2015-07-10 10:08:01 -0700 |
| commit | 5a1356916d40321736e336004aba31c39d6d6995 (patch) | |
| tree | fd2730cbc58b9dbdf873c6b866f6d7760cca3aed /core/java/android/widget/ImageView.java | |
| parent | 9613e9b76410b15b7f2700080a17476bf9f3461c (diff) | |
Improve ImageView drawable re-use
Bug 22403868
Initial attempt only helped if setImageBitmap() was the only
thing called but during new-loading content it's common for a
placeholder to be set via setImageDrawable.
Tweak ImageView slightly to just have a BitmapDrawable that it
lazy-creates but will hold on to for any subsequent calls
to setImageBitmap
Change-Id: I7380521c7b363d458e4cda041f1f8b2b1fb3a93a
Diffstat (limited to 'core/java/android/widget/ImageView.java')
| -rw-r--r-- | core/java/android/widget/ImageView.java | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index a1e6cc8b0510..e13b96fb5ba1 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -91,6 +91,7 @@ public class ImageView extends View { private boolean mColorMod = false; private Drawable mDrawable = null; + private ImageViewBitmapDrawable mRecycleableBitmapDrawable = null; private ColorStateList mDrawableTintList = null; private PorterDuff.Mode mDrawableTintMode = null; private boolean mHasDrawableTint = false; @@ -588,18 +589,16 @@ public class ImageView extends View { */ @android.view.RemotableViewMethod public void setImageBitmap(Bitmap bm) { - // if this is used frequently, may handle bitmaps explicitly - // to reduce the intermediate drawable object - 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); + // Hacky fix to force setImageDrawable to do a full setImageDrawable + // instead of doing an object reference comparison + mDrawable = null; + if (mRecycleableBitmapDrawable == null) { + mRecycleableBitmapDrawable = new ImageViewBitmapDrawable( + mContext.getResources(), bm); } else { - setImageDrawable(new ImageViewBitmapDrawable(mContext.getResources(), bm)); + mRecycleableBitmapDrawable.setBitmap(bm); } + setImageDrawable(mRecycleableBitmapDrawable); } public void setImageState(int[] state, boolean merge) { @@ -868,6 +867,10 @@ public class ImageView extends View { } private void updateDrawable(Drawable d) { + if (d != mRecycleableBitmapDrawable && mRecycleableBitmapDrawable != null) { + mRecycleableBitmapDrawable.setBitmap(null); + } + if (mDrawable != null) { mDrawable.setCallback(null); unscheduleDrawable(mDrawable); |
