package com.xda.one.ui.widget; import com.xda.one.R; import com.xda.one.util.CompatUtils; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Outline; import android.graphics.Paint; import android.os.Build; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewOutlineProvider; import android.widget.ImageView; public class FloatingActionButton extends ImageView { private Paint mButtonPaint; public FloatingActionButton(final Context context, final AttributeSet attributeSet) { super(context, attributeSet); init(Color.BLUE); } public FloatingActionButton(final Context context) { super(context); init(Color.BLUE); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void init(final int color) { setClickable(true); if (CompatUtils.hasElevation()) { final int diameter = getResources().getDimensionPixelSize(R.dimen.fab_size); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(final View view, final Outline outline) { outline.setOval(0, 0, diameter, diameter); } }); setClipToOutline(true); setElevation(getResources().getDimension(R.dimen.fab_elevation)); } else { ViewCompat.setLayerType(this, ViewCompat.LAYER_TYPE_SOFTWARE, null); super.setBackgroundColor(Color.TRANSPARENT); updatePreLBackgroundColor(color); } invalidate(); } private void updatePreLBackgroundColor(int color) { mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mButtonPaint.setColor(color); mButtonPaint.setStyle(Paint.Style.FILL); mButtonPaint.setShadowLayer(10f, 0.0f, 3.5f, Color.argb(100, 0, 0, 0)); } @Override protected void onDraw(final Canvas canvas) { if (!CompatUtils.hasLollipop()) { canvas.drawCircle(getWidth() / 2, getHeight() / 2, (getWidth() / 2f) - 10f, mButtonPaint); } super.onDraw(canvas); } @Override public boolean onTouchEvent(final MotionEvent event) { if (CompatUtils.hasLollipop()) { return super.onTouchEvent(event); } switch (event.getAction()) { case MotionEvent.ACTION_UP: setAlpha(1.0f); break; case MotionEvent.ACTION_DOWN: setAlpha(0.6f); break; } return super.onTouchEvent(event); } @Override public void setBackgroundColor(final int fabColor) { if (CompatUtils.hasLollipop()) { super.setBackgroundColor(fabColor); } else { updatePreLBackgroundColor(fabColor); invalidate(); } } }