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