|
package me.alexrs.circularbutton.lib; |
|
|
|
import android.annotation.TargetApi; |
|
import android.content.Context; |
|
import android.content.res.TypedArray; |
|
import android.graphics.Canvas; |
|
import android.graphics.Color; |
|
import android.graphics.Paint; |
|
import android.os.Build; |
|
import android.util.AttributeSet; |
|
import android.view.View; |
|
import android.widget.ImageView; |
|
|
|
/** |
|
* Created by Alejandro on 06/06/14. |
|
*/ |
|
|
|
/** |
|
* A Google Plus like, circular button for Android. |
|
* See https://github.com/Alexrs95/CircularButton |
|
*/ |
|
public class CircularButton extends ImageView { |
|
|
|
/** |
|
* The dimension of the shadow is a 15% of the radius of the button |
|
*/ |
|
private static float SHADOW_CONSTANT = 0.15F; |
|
|
|
private Paint mButtonPaint; |
|
private float centerX; |
|
private float centerY; |
|
private int btnRadius; |
|
private int buttonColor = Color.WHITE; |
|
private int shadowColor = Color.GRAY; |
|
|
|
public CircularButton(Context context) { |
|
super(context); |
|
init(context, null); |
|
} |
|
|
|
public CircularButton(Context context, AttributeSet attrs) { |
|
super(context, attrs); |
|
init(context, attrs); |
|
} |
|
|
|
public CircularButton(Context context, AttributeSet attrs, int defStyle) { |
|
super(context, attrs, defStyle); |
|
init(context, attrs); |
|
} |
|
|
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB) |
|
private void init(Context context, AttributeSet attrs) { |
|
setScaleType(ScaleType.CENTER_INSIDE); |
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { |
|
setLayerType(View.LAYER_TYPE_SOFTWARE, null); |
|
} |
|
|
|
mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG); |
|
mButtonPaint.setStyle(Paint.Style.FILL); |
|
|
|
if (attrs != null) { |
|
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircularButton); |
|
buttonColor = a.getColor(R.styleable.CircularButton_buttonColor, buttonColor); |
|
shadowColor = a.getColor(R.styleable.CircularButton_shadowColor, shadowColor); |
|
a.recycle(); |
|
} |
|
setButtonColor(buttonColor); |
|
} |
|
|
|
@Override |
|
protected void onDraw(Canvas canvas) { |
|
canvas.drawCircle(centerX, centerY, btnRadius - (btnRadius * SHADOW_CONSTANT), mButtonPaint); |
|
super.onDraw(canvas); |
|
} |
|
|
|
@Override |
|
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { |
|
super.onSizeChanged(width, height, oldWidth, oldHeight); |
|
centerX = width / 2; |
|
centerY = height / 2; |
|
btnRadius = Math.min(width, height) / 2; |
|
|
|
//the shadow color is settled here because its dimension depends on the radius of the button |
|
setShadowColor(shadowColor); |
|
} |
|
|
|
|
|
public void setButtonColor(int color) { |
|
this.buttonColor = color; |
|
mButtonPaint.setColor(buttonColor); |
|
invalidate(); |
|
} |
|
|
|
public void setShadowColor(int color) { |
|
this.shadowColor = color; |
|
mButtonPaint.setShadowLayer(btnRadius * SHADOW_CONSTANT, 0, 0, shadowColor); |
|
invalidate(); |
|
} |
|
|
|
public int getButtonColor() { |
|
return buttonColor; |
|
} |
|
|
|
public int getShadowColor() { |
|
return shadowColor; |
|
} |
|
} |