public boolean draw(Canvas canvas){
  update();
  final float centerX=mBounds.centerX();
  final float centerY=mBounds.height() - mRadius;
  canvas.scale(1.f,Math.min(mGlowScaleY,1.f) * mBaseGlowScale,centerX,0);
  final float displacement=Math.max(0,Math.min(mDisplacement,1.f)) - 0.5f;
  float translateX=mBounds.width() * displacement / 2;
  mPaint.setAlpha((int)(0xff * mGlowAlpha));
  canvas.drawCircle(centerX + translateX,centerY,mRadius,mPaint);
  boolean oneLastFrame=false;
  if (mState == STATE_RECEDE && mGlowScaleY == 0) {
    mState=STATE_IDLE;
    oneLastFrame=true;
  }
  return mState != STATE_IDLE || oneLastFrame;
}

public boolean draw ( Canvas canvas ) { update ( ) ; final float centerX = mBounds . centerX ( ) ; final float centerY = mBounds . height ( ) - mRadius ; canvas . scale ( 1.f , Math . min ( mGlowScaleY , 1.f ) * mBaseGlowScale , centerX , 0 ) ; final float displacement = Math . max ( 0 , Math . min ( mDisplacement , 1.f ) ) - 0.5f ; float translateX = mBounds . width ( ) * displacement / 2 ; mPaint . setAlpha ( ( int ) ( 0xff * mGlowAlpha ) ) ; canvas . drawCircle ( centerX + translateX , centerY , mRadius , mPaint ) ; boolean oneLastFrame = false ; if ( mState == STATE_RECEDE && mGlowScaleY == 0 ) { mState = STATE_IDLE ; oneLastFrame = true ; } return mState != STATE_IDLE || oneLastFrame ; }
draw into the provided canvas . assumes that the canvas has been rotated accordingly and the size has been set . the effect will be drawn the full width of x = 0 to x = width , beginning from y = 0 and extending to some factor < 1 . f of height .
