/**
  * Apply an arbitrary colorfilter to the image.
  *
  * @param cf the colorfilter to apply (may be null)
  */
 public void setColorFilter(ColorFilter cf) {
   if (mColorFilter != cf) {
     mColorFilter = cf;
     applyColorMod();
     invalidate();
   }
 }
 public void setAlpha(int alpha) {
   alpha &= 0xFF; // keep it legal
   if (mAlpha != alpha) {
     mAlpha = alpha;
     applyColorMod();
     invalidate();
   }
 }
 @Override
 protected boolean onSetAlpha(int alpha) {
   if (getBackground() == null) {
     int scale = alpha + (alpha >> 7);
     if (mViewAlphaScale != scale) {
       mViewAlphaScale = scale;
       applyColorMod();
     }
     return true;
   }
   return false;
 }
 private void updateDrawable(Drawable d) {
   if (mDrawable != null) {
     mDrawable.setCallback(null);
     unscheduleDrawable(mDrawable);
   }
   mDrawable = d;
   if (d != null) {
     d.setCallback(this);
     if (d.isStateful()) {
       d.setState(getDrawableState());
     }
     d.setLevel(mLevel);
     mDrawableWidth = d.getIntrinsicWidth();
     mDrawableHeight = d.getIntrinsicHeight();
     applyColorMod();
     configureBounds();
   }
 }