/
ConcentricCirclesDrawable.java
115 lines (93 loc) · 3.3 KB
/
ConcentricCirclesDrawable.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.orangemako.minesweeper.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import java.util.ArrayList;
import java.util.List;
public class ConcentricCirclesDrawable extends Drawable {
static final float DEFAULT_FILL_PERCENT = 0.55f;
static final int DEFAULT_OUTER_RING_COLOR = Color.GREEN;
static final int DEFAULT_INNER_RING_COLOR = Color.YELLOW;
private float mfillPercent = DEFAULT_FILL_PERCENT;
private int[] mRingColorList;
private Paint mPaint;
private ConcentricCirclesDrawableState mDrawableState;
public ConcentricCirclesDrawable() {
this(null, null);
}
/**
* Creates concentric circles using the supplied color list.
*
* @param ringColorList list of colors assigned from the outside
* ring (index 0) to the center ring (index n)
* @param fillPercent percent of space this drawable should take up within its bounds.
*/
public ConcentricCirclesDrawable(int[] ringColorList, Float fillPercent) {
if(ringColorList == null) {
mRingColorList = new int[]{DEFAULT_OUTER_RING_COLOR, DEFAULT_INNER_RING_COLOR};
}
else {
mRingColorList = ringColorList;
}
if(fillPercent != null) {
mfillPercent = fillPercent;
}
setupDrawObjects();
saveConstantState();
}
private void saveConstantState() {
if(mDrawableState == null) {
mDrawableState = new ConcentricCirclesDrawableState();
mDrawableState.mfillPercent = mfillPercent;
mDrawableState.mRingColorList = mRingColorList;
}
}
private void setupDrawObjects() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL);
}
@Override
public void draw(Canvas canvas) {
Rect bounds = getBounds();
float interval = mfillPercent / mRingColorList.length;
for(int i = 0; i < mRingColorList.length; i++) {
mPaint.setColor(mRingColorList[i]);
drawCenteredCircle(bounds, mfillPercent - (i * interval), canvas, mPaint);
}
}
private void drawCenteredCircle(Rect bounds, float radiusPercentage, Canvas canvas, Paint paint) {
float radius = Math.min(bounds.height(), bounds.width()) * radiusPercentage / 2;
canvas.drawCircle(bounds.centerX(), bounds.centerY(), radius, paint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return 0;
}
@Override
public ConstantState getConstantState() {
return mDrawableState;
}
private class ConcentricCirclesDrawableState extends ConstantState {
private float mfillPercent;
private int[] mRingColorList;
@Override
public Drawable newDrawable() {
return new ConcentricCirclesDrawable(mRingColorList, mfillPercent);
}
@Override
public int getChangingConfigurations() {
return 0;
}
}
}