package vandy.mooc.view.ui; import vandy.mooc.R; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.OvershootInterpolator; /** * CustomView that shows how to create a Floating Action Button, as * per Google's Material Design principles. */ public class FloatingActionButton extends View { /** * An interpolator where the change flings forward and overshoots * the last value then comes back. */ final static OvershootInterpolator overshootInterpolator = new OvershootInterpolator(); /** * An interpolator where the rate of change starts out slowly and * and then accelerates. */ final static AccelerateInterpolator accelerateInterpolator = new AccelerateInterpolator(); /** * Paints used to draw the Button in Canvas. */ Paint mButtonPaint; Paint mDrawablePaint; /** * Bitmap of the icon present in Floating Action Button */ Bitmap mBitmap; Drawable drawable; int color = Color.WHITE; /** * Boolean to indicate if the Button is hidden or not. */ boolean mHidden = false; /** * Constructor that initializes the Floating * Action Button. * * @param context */ public FloatingActionButton(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FabView); this.color = a.getColor(R.styleable.FabView_fabColor, Color.WHITE); this.drawable = a.getDrawable(R.styleable.FabView_fabDrawable); this.mBitmap = ((BitmapDrawable)drawable).getBitmap(); a.recycle(); init(color); } /** * Sets the Color of FloatingActionButton. * * @param FloatingActionButtonColor */ public void setFloatingActionButtonColor(int color) { this.color = color; invalidate(); } /** * Sets the Icon of FloatingActionButton. * * @param FloatingActionButtonDrawable */ public void setFloatingActionButtonDrawable(Drawable drawable) { this.mBitmap = ((BitmapDrawable) drawable).getBitmap(); invalidate(); } /** * Initialize all the Resources needed before drawing. * * @param FloatingActionButtonColor */ public void init(int FloatingActionButtonColor) { setWillNotDraw(false); setLayerType(View.LAYER_TYPE_SOFTWARE, null); mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mButtonPaint.setColor(FloatingActionButtonColor); mButtonPaint.setStyle(Paint.Style.FILL); mButtonPaint.setShadowLayer(10.0f, 0.0f, 3.5f, Color.argb(100, 0, 0, 0)); mDrawablePaint = new Paint(Paint.ANTI_ALIAS_FLAG); invalidate(); } /** * Hook method called to draw the View on the Canvas. * *@param canvas */ @Override protected void onDraw(Canvas canvas) { setClickable(true); float cx = getWidth() / 2; float cy = getHeight() / 2; float radius = getWidth() / 2.6f; float left = (float) (cx - (0.5*mBitmap.getWidth())); float top = (getHeight() - mBitmap.getHeight()) / 2; canvas.drawCircle(cx, cy, radius, mButtonPaint); canvas.drawBitmap(mBitmap, left, top, mDrawablePaint); } /** * Hook method called when View is Touched. * * @param event */ @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) setAlpha(1.0f); else if (event.getAction() == MotionEvent.ACTION_DOWN) setAlpha(0.6f); return super.onTouchEvent(event); } /** * Hides the Floating Action Button with some Animation. */ public void hideFloatingActionButton() { if (!mHidden) { ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 1, 0); ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 1, 0); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(scaleX, scaleY); animSetXY.setInterpolator(accelerateInterpolator); animSetXY.setDuration(100); animSetXY.start(); mHidden = true; } } /** * Shows the Floating Action Button with some Animation. */ public void showFloatingActionButton() { if (mHidden) { ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 0, 1); ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 0, 1); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(scaleX, scaleY); animSetXY.setInterpolator(overshootInterpolator); animSetXY.setDuration(200); animSetXY.start(); mHidden = false; } } /** * @return True if the View is hidden. */ public boolean isHidden() { return mHidden; } }