BitmapDrawableImageView.java revision b6ec2afe9710112214d79b36b2233fef6a52845a
1a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie/* 2a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * Copyright (C) 2013 The Android Open Source Project 3a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * 4a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * Licensed under the Apache License, Version 2.0 (the "License"); 5a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * you may not use this file except in compliance with the License. 6a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * You may obtain a copy of the License at 7a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * 8a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * http://www.apache.org/licenses/LICENSE-2.0 9a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * 10a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * Unless required by applicable law or agreed to in writing, software 11a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * distributed under the License is distributed on an "AS IS" BASIS, 12a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * See the License for the specific language governing permissions and 14a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * limitations under the License. 15a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie */ 16a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 17a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffiepackage com.android.bitmap.view; 18a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 19a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport android.content.Context; 20a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport android.graphics.Bitmap; 21a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport android.graphics.drawable.Drawable; 22a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport android.net.Uri; 23a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport android.util.AttributeSet; 24a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport android.widget.ImageView; 25a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 26a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieimport com.android.bitmap.drawable.BasicBitmapDrawable; 27a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 28a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie/** 29a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * A helpful ImageView replacement that can generally be used in lieu of ImageView. 30a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * BitmapDrawableImageView has logic to unbind its BasicBitmapDrawable when it is detached from the 31a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * window. 32a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie */ 33a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffiepublic class BitmapDrawableImageView extends ImageView { 34a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie private BasicBitmapDrawable mDrawable; 35a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 36a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public BitmapDrawableImageView(final Context context) { 37a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie this(context, null); 38a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 39a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 40a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public BitmapDrawableImageView(final Context context, final AttributeSet attrs) { 41a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie this(context, attrs, 0); 42a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 43a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 44a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public BitmapDrawableImageView(final Context context, final AttributeSet attrs, 45a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie final int defStyle) { 46a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super(context, attrs, defStyle); 47a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 48a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 49a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie /** 50a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * Get the source BasicBitmapDrawable for this BitmapDrawableImageView. 51a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * @return The source drawable. 52a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie */ 53a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public BasicBitmapDrawable getBasicBitmapDrawable() { 54a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie return mDrawable; 55a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 56a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 57a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie /** 58a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * Set the given BasicBitmapDrawable as the source for this BitmapDrawableImageView. 59a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie * @param drawable The source drawable. 60a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie */ 61a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public void setBasicBitmapDrawable(BasicBitmapDrawable drawable) { 62a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super.setImageDrawable(drawable); 63a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie unbindDrawable(); 64a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie mDrawable = drawable; 65a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 66a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 67a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie private void unbindDrawable() { 68a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie if (mDrawable != null) { 69a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie mDrawable.unbind(); 70a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 71a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 72a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 73a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie @Override 74a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public void setImageResource(final int resId) { 75a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super.setImageResource(resId); 76a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie unbindDrawable(); 77a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie mDrawable = null; 78a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 79a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 80a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie @Override 81a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public void setImageURI(final Uri uri) { 82a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super.setImageURI(uri); 83a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie unbindDrawable(); 84a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie mDrawable = null; 85a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 86a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 87a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie @Override 88a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public void setImageDrawable(final Drawable drawable) { 89a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super.setImageDrawable(drawable); 90a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie unbindDrawable(); 91a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie mDrawable = null; 92a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 93a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 94a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie @Override 95a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie public void setImageBitmap(final Bitmap bm) { 96a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super.setImageBitmap(bm); 97a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie unbindDrawable(); 98a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie mDrawable = null; 99a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 100a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 101a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie @Override 102a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie protected void onDetachedFromWindow() { 103a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie super.onDetachedFromWindow(); 104a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie unbindDrawable(); 105a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie } 106a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie} 107a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie