Skip to content

Commit a0f04bd

Browse files
authored
Merge pull request #2 from NetoDevel/master
Adds border to multiple check
2 parents 28f4a52 + f7dbc9a commit a0f04bd

File tree

8 files changed

+336
-7
lines changed

8 files changed

+336
-7
lines changed

README.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ Also you can enable hints, that shows in Toast by long pressing a button
102102

103103
### If you want to use multiple checks
104104

105+
105106
<p align="center">
106107
<img src="etc/circle-menu-checked.gif" height="500" alt="progress image view" />
107108
</p>
@@ -118,11 +119,40 @@ Also you can enable hints, that shows in Toast by long pressing a button
118119
</com.imangazaliev.circlemenu.CircleMenu>
119120
```
120121

121-
### Multiple checks attributes
122+
### Animated border to multiple checks
123+
124+
<p align="center">
125+
<img src="etc/check-border.gif" height="500" alt="progress image view" />
126+
</p>
127+
128+
```xml
129+
<com.imangazaliev.circlemenu.CircleMenu
130+
...
131+
app:multiple_check="true"
132+
app:border_check="true"
133+
app:alpha_check="false"
134+
app:center_drawable="@drawable/ic_add_alert_black_24dp"
135+
app:confirmation_center_drawable="@drawable/ic_send_red">
136+
137+
<!-- Add your menu button items here -->
138+
139+
</com.imangazaliev.circlemenu.CircleMenu>
140+
```
141+
142+
### Multiple checks attributes on Circle Menu
143+
122144
* `app:multiple_check` : Enables the multiple_check selection (Default: `false`)
145+
* `app:border_check="true"`: Enable animation border
146+
* `app:alpha_check="false"`: Enable animation alpha
123147
* `app:center_drawable` : Path to your custom graphic resource
124148
* `app:confirmation_center_drawable` : Path to your custom confirmation button graphic resource
125149

150+
### Attributes on Circle Menu Button
151+
152+
* `app:enable_border` : Enable animation border
153+
* `app:full_drawable` : When you want to draw in full circle
154+
155+
126156
## License
127157

128158
The MIT License

app/src/main/java/com/imangazaliev/circlemenu/sample/MainActivity.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ protected void onCreate(Bundle savedInstanceState) {
2121
final ViewGroup snackbarContainer = (ViewGroup) findViewById(R.id.snackbar_contaner);
2222

2323
final CircleMenu circleMenuDefault = (CircleMenu) findViewById(R.id.circle_menu_default);
24-
final CircleMenu circleMenuMultiple = (CircleMenu) findViewById(R.id.circle_menu_multiple);
24+
//final CircleMenu circleMenuMultiple = (CircleMenu) findViewById(R.id.circle_menu_multiple);
25+
final CircleMenu circleMenuMultipleBorder = (CircleMenu) findViewById(R.id.circle_menu_multiple_border);
2526

2627
prepareViewCircleMenuDefault(circleMenuDefault, snackbarContainer);
27-
prepareViewCircleMenuMultiple(circleMenuMultiple);
28+
//prepareViewCircleMenuMultiple(circleMenuMultiple);
29+
prepareViewCircleMenuMultipleBorder(circleMenuMultipleBorder);
2830
}
2931

3032
private void prepareViewCircleMenuDefault(CircleMenu circleMenu, final ViewGroup snackbarContainer) {
@@ -58,6 +60,7 @@ private void prepareViewCircleMenuMultiple(CircleMenu circleMenuMultiple) {
5860
circleMenuButton.setColorNormal(R.color.color_normal);
5961
circleMenuButton.setColorPressed(R.color.color_pressed);
6062
circleMenuButton.setIconResId(R.drawable.ic_favorite);
63+
circleMenuButton.setFullDrawable(false);
6164
circleMenuButton.setMetaData(new ExampleData(i));
6265

6366
circleMenuMultiple.addButton(circleMenuButton);
@@ -77,4 +80,35 @@ public void onConfirmation(List<Object> listData) {
7780
});
7881
}
7982

83+
84+
private void prepareViewCircleMenuMultipleBorder(CircleMenu circleMenu) {
85+
/**
86+
* adding dynamically
87+
*/
88+
for (int i = 0; i < 4; i ++) {
89+
CircleMenuButton circleMenuButton = new CircleMenuButton(this);
90+
91+
circleMenuButton.setColorNormal(R.color.color_normal);
92+
circleMenuButton.setColorPressed(R.color.color_pressed);
93+
circleMenuButton.setIconResId(R.drawable.ic_favorite);
94+
circleMenuButton.setEnableBorder(true);
95+
circleMenuButton.setMetaData(new ExampleData(i));
96+
97+
circleMenu.addButton(circleMenuButton);
98+
}
99+
100+
/**
101+
* get meta data of circles selected
102+
*/
103+
circleMenu.setOnConfirmationListener(new CircleMenu.OnConfirmationListener() {
104+
@Override
105+
public void onConfirmation(List<Object> listData) {
106+
for (int i =0; i< listData.size(); i++ ) {
107+
ExampleData exampleData = (ExampleData) listData.get(i);
108+
Log.d("MainActivity", "Id: " + exampleData.getId());
109+
}
110+
}
111+
});
112+
}
113+
80114
}

app/src/main/res/layout/activity_main.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,27 @@
5858

5959
</com.imangazaliev.circlemenu.CircleMenu>
6060

61+
<!--<com.imangazaliev.circlemenu.CircleMenu-->
62+
<!--android:id="@+id/circle_menu_multiple"-->
63+
<!--android:layout_width="wrap_content"-->
64+
<!--android:layout_height="wrap_content"-->
65+
<!--android:layout_centerInParent="true"-->
66+
<!--app:hintsEnabled="true"-->
67+
<!--app:multiple_check="true"-->
68+
<!--app:center_drawable="@drawable/ic_add_alert_black_24dp"-->
69+
<!--app:confirmation_center_drawable="@drawable/ic_send_red">-->
70+
<!--</com.imangazaliev.circlemenu.CircleMenu>-->
71+
72+
6173
<com.imangazaliev.circlemenu.CircleMenu
62-
android:id="@+id/circle_menu_multiple"
74+
android:id="@+id/circle_menu_multiple_border"
6375
android:layout_width="wrap_content"
6476
android:layout_height="wrap_content"
6577
android:layout_centerInParent="true"
6678
app:hintsEnabled="true"
6779
app:multiple_check="true"
80+
app:border_check="true"
81+
app:alpha_check="false"
6882
app:center_drawable="@drawable/ic_add_alert_black_24dp"
6983
app:confirmation_center_drawable="@drawable/ic_send_red">
7084
</com.imangazaliev.circlemenu.CircleMenu>

etc/check-border.gif

181 KB
Loading
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.imangazaliev.circlemenu;
2+
3+
import android.graphics.Bitmap;
4+
import android.graphics.BitmapShader;
5+
import android.graphics.Canvas;
6+
import android.graphics.Paint;
7+
import android.graphics.RectF;
8+
import android.graphics.Shader;
9+
import android.graphics.drawable.BitmapDrawable;
10+
import android.graphics.drawable.Drawable;
11+
12+
/**
13+
* @author NetoDevel
14+
*/
15+
public class BitmapHelper {
16+
17+
public static void transformCircularBitmap(Canvas canvas, Bitmap newBitmap) {
18+
BitmapShader shader;
19+
shader = new BitmapShader(newBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
20+
21+
Paint paint = new Paint();
22+
paint.setAntiAlias(true);
23+
paint.setShader(shader);
24+
25+
float r = newBitmap.getWidth() / 2f;
26+
27+
canvas.drawCircle(r, r, r, paint);
28+
}
29+
30+
public static RectF createRectFFromBitmap(Bitmap bitmap, int mBorderWidth) {
31+
RectF fBounds = new RectF();
32+
33+
int offset = (bitmap.getWidth() - bitmap.getHeight()) / 2;
34+
35+
int left = offset + mBorderWidth;
36+
int right = bitmap.getWidth() - offset - mBorderWidth;
37+
int bottom = bitmap.getHeight() - mBorderWidth;
38+
int top = mBorderWidth;
39+
40+
fBounds.left = left + mBorderWidth / 2f + .5f;
41+
fBounds.right = right - mBorderWidth / 2f - .5f;
42+
fBounds.top = top + mBorderWidth / 2f + .5f;
43+
fBounds.bottom = bottom - mBorderWidth / 2f - .5f;
44+
45+
return fBounds;
46+
}
47+
48+
public static Bitmap resizeBitmap(Bitmap source, int width, int height) {
49+
return Bitmap.createScaledBitmap(source, width, height, false);
50+
}
51+
52+
public static Bitmap drawableToBitmap(Drawable drawable) {
53+
Bitmap bitmap = null;
54+
55+
if (drawable instanceof BitmapDrawable) {
56+
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
57+
if(bitmapDrawable.getBitmap() != null) {
58+
return bitmapDrawable.getBitmap();
59+
}
60+
}
61+
62+
if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
63+
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
64+
} else {
65+
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
66+
}
67+
68+
Canvas canvas = new Canvas(bitmap);
69+
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
70+
drawable.draw(canvas);
71+
return bitmap;
72+
}
73+
74+
}
75+
76+

library/src/main/java/com/imangazaliev/circlemenu/CircleMenu.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public interface OnConfirmationListener {
3737
private int circleStartAngle;
3838
private boolean hintsEnabled;
3939
private boolean multipleCheck;
40+
private boolean borderCheck;
41+
private boolean alphaCheck;
4042

4143
public CenterMenuButton getCenterButton() {
4244
return centerButton;
@@ -61,6 +63,9 @@ public void setCenterButton(CenterMenuButton centerButton) {
6163
private Drawable centerMenuButtonDrawable;
6264
private Drawable confirmationMenuButtonDrawable;
6365

66+
private float alphaChecked = 0.5f;
67+
private float alphaUnChecked = 1f;
68+
6469
public CircleMenu(Context context) {
6570
this(context, null);
6671
}
@@ -84,6 +89,8 @@ private void init(AttributeSet attrs) {
8489
hintsEnabled = typedArray.getBoolean(R.styleable.CircleMenu_hintsEnabled, false);
8590
centerMenuButtonDrawable = typedArray.getDrawable(R.styleable.CircleMenu_center_drawable);
8691
multipleCheck = typedArray.getBoolean(R.styleable.CircleMenu_multiple_check, false);
92+
borderCheck = typedArray.getBoolean(R.styleable.CircleMenu_border_check, false);
93+
alphaCheck = typedArray.getBoolean(R.styleable.CircleMenu_alpha_check, true);
8794
confirmationMenuButtonDrawable = typedArray.getDrawable(R.styleable.CircleMenu_confirmation_center_drawable);
8895
listObjectData = new ArrayList<>();
8996
listIndentifyChildMenuButton = new HashMap<>();
@@ -114,6 +121,7 @@ private void addChildrenToController() {
114121

115122
private void createCenterButton(Context context) {
116123
centerButton = new CenterMenuButton(context);
124+
centerButton.setHasCenterButton(true);
117125
centerButton.setOnClickListener(new OnClickListener() {
118126
@Override
119127
public void onClick(View v) {
@@ -271,7 +279,9 @@ public void onCollapsed() {
271279
addCenterDrawableIfEnable();
272280
centerButton.setClickable(true);
273281
if (this.multipleCheck) {
274-
onConfirmationListener.onConfirmation(listObjectData);
282+
if (onConfirmationListener != null) {
283+
onConfirmationListener.onConfirmation(listObjectData);
284+
}
275285
clearClircleMenuButtons();
276286
}
277287
if (stateUpdateListener != null) {
@@ -289,7 +299,6 @@ private void clearClircleMenuButtons() {
289299
public void onItemClick(CircleMenuButton menuButton) {
290300
centerButton.setExpanded(false);
291301
if (multipleCheck) {
292-
menuButton.setAlpha(0.2f);
293302
if (verifyAlreadyChecked(menuButton.getGenerateId())) {
294303
removeCheck(menuButton);
295304
} else {
@@ -306,16 +315,35 @@ public void onItemClick(CircleMenuButton menuButton) {
306315

307316
private void addCheck(CircleMenuButton menuButton) {
308317
menuButton.setGenerateId(UUID.randomUUID().toString());
318+
addCheckedAnimation(menuButton);
309319
listIndentifyChildMenuButton.put(menuButton.getGenerateId(), menuButton);
310320
listObjectData.add(menuButton.getMetaData());
311321
}
312322

323+
private void addCheckedAnimation(CircleMenuButton menuButton) {
324+
if (alphaCheck){
325+
menuButton.setAlpha(alphaChecked);
326+
}
327+
if (borderCheck){
328+
menuButton.startCheckAnimation();
329+
}
330+
}
331+
313332
private void removeCheck(CircleMenuButton menuButton) {
314-
menuButton.setAlpha(1f);
333+
unCheckedAnimation(menuButton);
315334
listObjectData.remove(menuButton.getMetaData());
316335
listIndentifyChildMenuButton.remove(menuButton.getGenerateId());
317336
}
318337

338+
private void unCheckedAnimation(CircleMenuButton menuButton) {
339+
if (alphaCheck){
340+
menuButton.setAlpha(alphaUnChecked);
341+
}
342+
if (borderCheck){
343+
menuButton.reverseCheckAnimation();
344+
}
345+
}
346+
319347
public void setStatusDefaultCircleMenuButton() {
320348
for(Map.Entry<String, CircleMenuButton> entry : listIndentifyChildMenuButton.entrySet()) {
321349
CircleMenuButton cirleMenuButton = entry.getValue();
@@ -382,4 +410,16 @@ public void setMultipleCheck(boolean buttonConfimation) {
382410
this.multipleCheck = buttonConfimation;
383411
}
384412

413+
public void setAlphaChecked(float alphaChecked) {
414+
this.alphaChecked = alphaChecked;
415+
}
416+
417+
public void setBorderChecked(boolean borderCheck) {
418+
this.borderCheck = borderCheck;
419+
}
420+
421+
public void setAlphaUnChecked(float alphaUnChecked) {
422+
this.alphaUnChecked = alphaUnChecked;
423+
}
424+
385425
}

0 commit comments

Comments
 (0)