BitmapDrawableImageView.java revision d7654f820a99358a7d2b2afb9b3a174690e213f6
146616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei/* 246616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * Copyright (C) 2013 The Android Open Source Project 346616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * 446616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * Licensed under the Apache License, Version 2.0 (the "License"); 546616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * you may not use this file except in compliance with the License. 646616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * You may obtain a copy of the License at 746616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * 846616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * http://www.apache.org/licenses/LICENSE-2.0 946616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * 1046616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * Unless required by applicable law or agreed to in writing, software 1146616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * distributed under the License is distributed on an "AS IS" BASIS, 1246616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * See the License for the specific language governing permissions and 1446616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * limitations under the License. 1546616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei */ 1646616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei 17a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weipackage com.android.bitmap.view; 18a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 19a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.content.Context; 20a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.graphics.Bitmap; 21a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.graphics.drawable.Drawable; 22a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.net.Uri; 23d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Weiimport android.os.Build; 24a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.util.AttributeSet; 25a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.widget.ImageView; 26a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 27a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport com.android.bitmap.drawable.BasicBitmapDrawable; 28a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 29a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei/** 30a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei * A helpful ImageView replacement that can generally be used in lieu of ImageView. 319c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei * BitmapDrawableImageView has logic to unbind its BasicBitmapDrawable when it is detached from the 329c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei * window. 33a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei */ 349c6ac19d4a3d39b7c2992060957920118ff56a65Mark Weipublic class BitmapDrawableImageView extends ImageView { 35d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Wei private static final boolean hasTransientStateSupported = 36d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Wei Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 37a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei private BasicBitmapDrawable mDrawable; 389024423249c9b1779f523cc4fe757fda2d205844Mark Wei private boolean mAttachedToWindow; 39a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 409c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public BitmapDrawableImageView(final Context context) { 41a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei this(context, null); 42a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 43a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 449c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public BitmapDrawableImageView(final Context context, final AttributeSet attrs) { 45a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei this(context, attrs, 0); 46a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 47a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 489c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public BitmapDrawableImageView(final Context context, final AttributeSet attrs, 499c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei final int defStyle) { 50a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei super(context, attrs, defStyle); 51a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 52a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 53a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei /** 5489e59f00d67791754e44e65413baa95f94056df4Mark Wei * Get the source drawable for this BitmapDrawableImageView. 5589e59f00d67791754e44e65413baa95f94056df4Mark Wei * @return The source drawable casted to the given type, or null if the type does not match. 569c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei */ 5789e59f00d67791754e44e65413baa95f94056df4Mark Wei @SuppressWarnings("unchecked") // Cast to type parameter. 5889e59f00d67791754e44e65413baa95f94056df4Mark Wei public <E extends BasicBitmapDrawable> E getTypedDrawable() { 5989e59f00d67791754e44e65413baa95f94056df4Mark Wei try { 6089e59f00d67791754e44e65413baa95f94056df4Mark Wei return (E) mDrawable; 6189e59f00d67791754e44e65413baa95f94056df4Mark Wei } catch (Exception ignored) { 6289e59f00d67791754e44e65413baa95f94056df4Mark Wei return null; 6389e59f00d67791754e44e65413baa95f94056df4Mark Wei } 649c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei } 659c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei 669c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei /** 6789e59f00d67791754e44e65413baa95f94056df4Mark Wei * Set the given drawable as the source for this BitmapDrawableImageView. 68a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei * @param drawable The source drawable. 69a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei */ 7089e59f00d67791754e44e65413baa95f94056df4Mark Wei public <E extends BasicBitmapDrawable> void setTypedDrawable(E drawable) { 71a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei super.setImageDrawable(drawable); 729c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei unbindDrawable(); 73a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei mDrawable = drawable; 74a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 75a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 769c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei private void unbindDrawable() { 779c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei if (mDrawable != null) { 789c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei mDrawable.unbind(); 799c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei } 80a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 81a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 82a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei @Override 839c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public void setImageResource(final int resId) { 849c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei super.setImageResource(resId); 859c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei unbindDrawable(); 86b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei mDrawable = null; 87a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 88a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 89a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei @Override 909c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public void setImageURI(final Uri uri) { 919c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei super.setImageURI(uri); 929c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei unbindDrawable(); 93b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei mDrawable = null; 94a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 95a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 96a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei @Override 979c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public void setImageDrawable(final Drawable drawable) { 989c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei super.setImageDrawable(drawable); 999c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei unbindDrawable(); 100b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei mDrawable = null; 101a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 102a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 103a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei @Override 1049c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public void setImageBitmap(final Bitmap bm) { 1059c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei super.setImageBitmap(bm); 1069c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei unbindDrawable(); 107b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei mDrawable = null; 108a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 109a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei 110a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei @Override 1119024423249c9b1779f523cc4fe757fda2d205844Mark Wei protected void onAttachedToWindow() { 1129024423249c9b1779f523cc4fe757fda2d205844Mark Wei super.onAttachedToWindow(); 1139024423249c9b1779f523cc4fe757fda2d205844Mark Wei mAttachedToWindow = true; 1149024423249c9b1779f523cc4fe757fda2d205844Mark Wei } 1159024423249c9b1779f523cc4fe757fda2d205844Mark Wei 1169024423249c9b1779f523cc4fe757fda2d205844Mark Wei @Override 1179c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei protected void onDetachedFromWindow() { 1189c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei super.onDetachedFromWindow(); 1199024423249c9b1779f523cc4fe757fda2d205844Mark Wei mAttachedToWindow = false; 120d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Wei if (hasTransientStateSupported && !hasTransientState()) { 1219024423249c9b1779f523cc4fe757fda2d205844Mark Wei unbindDrawable(); 1229024423249c9b1779f523cc4fe757fda2d205844Mark Wei } 1239024423249c9b1779f523cc4fe757fda2d205844Mark Wei } 1249024423249c9b1779f523cc4fe757fda2d205844Mark Wei 1259024423249c9b1779f523cc4fe757fda2d205844Mark Wei @Override 1269024423249c9b1779f523cc4fe757fda2d205844Mark Wei public void setHasTransientState(boolean hasTransientState) { 1279024423249c9b1779f523cc4fe757fda2d205844Mark Wei super.setHasTransientState(hasTransientState); 1289024423249c9b1779f523cc4fe757fda2d205844Mark Wei if (!hasTransientState && !mAttachedToWindow) { 1299024423249c9b1779f523cc4fe757fda2d205844Mark Wei unbindDrawable(); 1309024423249c9b1779f523cc4fe757fda2d205844Mark Wei } 131a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei } 132a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei} 133