diff --git a/library/src/main/java/at/markushi/ui/CircleButton.java b/library/src/main/java/at/markushi/ui/CircleButton.java index 0e0ca84..77a3089 100644 --- a/library/src/main/java/at/markushi/ui/CircleButton.java +++ b/library/src/main/java/at/markushi/ui/CircleButton.java @@ -17,6 +17,8 @@ public class CircleButton extends ImageView { private static final int PRESSED_COLOR_LIGHTUP = 255 / 25; private static final int PRESSED_RING_ALPHA = 75; private static final int DEFAULT_PRESSED_RING_WIDTH_DIP = 4; + private static final int DEFAULT_SHADOW_X_OFFSET_DIP = 1; + private static final int DEFAULT_SHADOW_Y_OFFSET_DIP = 2; private static final int ANIMATION_TIME_ID = android.R.integer.config_shortAnimTime; private int centerY; @@ -29,6 +31,15 @@ public class CircleButton extends ImageView { private float animationProgress; + private float density = 3.0f; + private int shadowColor = Color.GRAY; + private int shadowXOffset = (int) TypedValue + .applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_SHADOW_X_OFFSET_DIP, + getResources().getDisplayMetrics()); + private int shadowYOffset = (int) TypedValue + .applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_SHADOW_Y_OFFSET_DIP, + getResources().getDisplayMetrics()); + private int pressedRingWidth; private int defaultColor = Color.BLACK; private int pressedColor; @@ -66,6 +77,8 @@ public void setPressed(boolean pressed) { @Override protected void onDraw(Canvas canvas) { + circlePaint.setShadowLayer(getShadowRadius(), shadowXOffset, shadowYOffset, shadowColor); + canvas.drawCircle(centerX, centerY, pressedRingRadius + animationProgress, focusPaint); canvas.drawCircle(centerX, centerY, outerRadius - pressedRingWidth, circlePaint); super.onDraw(canvas); @@ -117,6 +130,7 @@ private void init(Context context, AttributeSet attrs) { circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); circlePaint.setStyle(Paint.Style.FILL); + setLayerType(LAYER_TYPE_SOFTWARE, circlePaint); focusPaint = new Paint(Paint.ANTI_ALIAS_FLAG); focusPaint.setStyle(Paint.Style.STROKE); @@ -129,6 +143,9 @@ private void init(Context context, AttributeSet attrs) { final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleButton); color = a.getColor(R.styleable.CircleButton_cb_color, color); pressedRingWidth = (int) a.getDimension(R.styleable.CircleButton_cb_pressedRingWidth, pressedRingWidth); + shadowColor = a.getColor(R.styleable.CircleButton_cb_shadowColor, shadowColor); + shadowXOffset = (int) a.getDimension(R.styleable.CircleButton_cb_shadowXOffset, shadowXOffset); + shadowYOffset = (int) a.getDimension(R.styleable.CircleButton_cb_shadowYOffset, shadowYOffset); a.recycle(); } @@ -138,6 +155,15 @@ private void init(Context context, AttributeSet attrs) { final int pressedAnimationTime = getResources().getInteger(ANIMATION_TIME_ID); pressedAnimator = ObjectAnimator.ofFloat(this, "animationProgress", 0f, 0f); pressedAnimator.setDuration(pressedAnimationTime); + + density = getResources().getDisplayMetrics().density; + } + + private float getShadowRadius() { + if(isPressed()){ + return 0.0f; + } + return density * 2.0f; } private int getHighlightColor(int color, int amount) { diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 747de0a..c80926b 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -3,5 +3,8 @@ + + + \ No newline at end of file