Created
January 26, 2015 04:48
-
-
Save natuanorg/bb9354c1620959fe9edd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Sub-class of ImageView which automatically notifies the drawable when it is | |
* being displayed. | |
*/ | |
public class RecyclingImageView extends ImageView { | |
public RecyclingImageView(Context context) { | |
super(context); | |
} | |
public RecyclingImageView(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public RecyclingImageView(Context context, AttributeSet attrs, | |
int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
// TODO Auto-generated constructor stub | |
} | |
/** | |
* @see android.widget.ImageView#onDetachedFromWindow() | |
*/ | |
@Override | |
protected void onDetachedFromWindow() { | |
// This has been detached from Window, so clear the drawable | |
setImageDrawable(null); | |
super.onDetachedFromWindow(); | |
} | |
/** | |
* @see android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable) | |
*/ | |
@Override | |
public void setImageDrawable(Drawable drawable) { | |
// Keep hold of previous Drawable | |
final Drawable previousDrawable = getDrawable(); | |
// Call super to set new Drawable | |
super.setImageDrawable(drawable); | |
// Notify new Drawable that it is being displayed | |
notifyDrawable(drawable, true); | |
// Notify old Drawable so it is no longer being displayed | |
notifyDrawable(previousDrawable, false); | |
} | |
/** | |
* Notifies the drawable that it's displayed state has changed. | |
* | |
* @param drawable | |
* @param isDisplayed | |
*/ | |
private static void notifyDrawable(Drawable drawable, | |
final boolean isDisplayed) { | |
if (drawable instanceof RecyclingBitmapDrawable) { | |
// The drawable is a CountingBitmapDrawable, so notify it | |
((RecyclingBitmapDrawable) drawable).setIsDisplayed(isDisplayed); | |
} else if (drawable instanceof LayerDrawable) { | |
// The drawable is a LayerDrawable, so recurse on each layer | |
LayerDrawable layerDrawable = (LayerDrawable) drawable; | |
for (int i = 0, z = layerDrawable.getNumberOfLayers(); i < z; i++) { | |
notifyDrawable(layerDrawable.getDrawable(i), isDisplayed); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment