Skip to content

Commit 5bf35ca

Browse files
committed
added start pause restart methods in BallView
1 parent d43e881 commit 5bf35ca

File tree

5 files changed

+67
-8
lines changed

5 files changed

+67
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@
240240
android:layout_width="100dp"
241241
android:layout_height="100dp"
242242
lib:balls="10"
243-
lib:movement_cycle_time="1500"
243+
lib:movement_cycle_time="2500"
244244
lib:ball_colors="@array/colors"
245245
lib:path="diamond"
246246
lib:ball_size="4dp"

loadingballs/src/main/java/com/github/glomadrian/loadingballssample/BallView.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class BallView extends View {
2525
private float maxBallSize;
2626
private float ballSize = 20;
2727
private BallPathAnimator ballPathAnimator;
28+
private BallSizeAnimator ballSizeAnimator;
2829
private int numberOfBalls = 3;
2930
private int ballSizeAnimationDuration = 400;
3031
private int ballPathAnimationDuration = 1500;
@@ -81,28 +82,24 @@ private void initColorsAttributes(TypedArray attributes) {
8182
@Override
8283
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
8384
super.onSizeChanged(w, h, oldw, oldh);
84-
8585
Path path = PathFactory.makePath(pathType, new Point(w / 2, h / 2), w, h, (int) maxBallSize);
86-
8786
initBallPathAnimator(path);
88-
8987
if (sizeAnimationEnabled) {
9088
initBallSizeAnimator(path);
9189
}
90+
start();
9291
}
9392

9493
private void initBallPathAnimator(Path path) {
9594
ballPathAnimator = new BallPathAnimator(path, ballPathAnimationDuration);
9695
ballPathAnimator.setBallPathAnimatorListener(new AnimatorListener());
9796
ballPathAnimator.addBalls(balls);
98-
ballPathAnimator.start();
9997
}
10098

10199
private void initBallSizeAnimator(Path path) {
102-
BallSizeAnimator ballSizeAnimator =
100+
ballSizeAnimator =
103101
new BallSizeAnimator(path, ballSizeAnimationDuration, minBallSize, maxBallSize);
104102
ballSizeAnimator.addBalls(balls);
105-
ballSizeAnimator.start();
106103
}
107104

108105
private void createBalls() {
@@ -115,6 +112,27 @@ private void createBalls() {
115112
}
116113
}
117114

115+
public void start() {
116+
ballPathAnimator.start();
117+
if (sizeAnimationEnabled) {
118+
ballSizeAnimator.start();
119+
}
120+
}
121+
122+
public void stop() {
123+
ballPathAnimator.stop();
124+
if (sizeAnimationEnabled) {
125+
ballSizeAnimator.start();
126+
}
127+
}
128+
129+
public void restart() {
130+
ballPathAnimator.restart();
131+
if (sizeAnimationEnabled) {
132+
ballSizeAnimator.restart();
133+
}
134+
}
135+
118136
@Override
119137
protected void onDraw(Canvas canvas) {
120138
for (Ball ball : balls) {

loadingballs/src/main/java/com/github/glomadrian/loadingballssample/animator/AbstractBallAnimator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* @author Adrián García Lomas
99
*/
10-
public class AbstractBallAnimator {
10+
public abstract class AbstractBallAnimator {
1111

1212
protected List<Ball> balls;
1313
protected BallAnimatorListener ballAnimatorListener;
@@ -28,6 +28,12 @@ public void setBallPathAnimatorListener(BallAnimatorListener ballAnimatorListene
2828
this.ballAnimatorListener = ballAnimatorListener;
2929
}
3030

31+
public abstract void start();
32+
33+
public abstract void stop();
34+
35+
public abstract void restart();
36+
3137
public interface BallAnimatorListener {
3238

3339
void onUpdate();

loadingballs/src/main/java/com/github/glomadrian/loadingballssample/animator/BallPathAnimator.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,24 @@ private void initValueAnimator() {
5050
valueAnimator.addUpdateListener(this);
5151
}
5252

53+
@Override
5354
public void start() {
5455
float size = balls.size();
5556
offset = 1 / size;
5657
valueAnimator.start();
5758
}
5859

60+
@Override
61+
public void stop(){
62+
valueAnimator.cancel();
63+
}
64+
65+
@Override
66+
public void restart(){
67+
stop();
68+
start();
69+
}
70+
5971
@Override
6072
public void onAnimationUpdate(ValueAnimator animation) {
6173
float value = animation.getAnimatedFraction();

loadingballs/src/main/java/com/github/glomadrian/loadingballssample/animator/BallSizeAnimator.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import android.graphics.Path;
55
import android.view.animation.AccelerateDecelerateInterpolator;
66
import com.github.glomadrian.loadingballssample.Ball;
7+
import java.util.ArrayList;
8+
import java.util.List;
79

810
/**
911
* @author Adrián García Lomas
@@ -15,20 +17,40 @@ public class BallSizeAnimator extends AbstractBallAnimator {
1517
private Path path;
1618
private float minBallSize;
1719
private float maxBallSize;
20+
private List<ValueAnimator> animators;
1821

1922
public BallSizeAnimator(Path path, int duration, float minBallSize, float maxBallSize) {
2023
this.duration = duration;
2124
this.path = path;
2225
this.minBallSize = minBallSize;
2326
this.maxBallSize = maxBallSize;
27+
init();
28+
}
29+
30+
private void init() {
31+
animators = new ArrayList<>();
2432
}
2533

2634
public void start() {
35+
animators.clear();
2736
for (int i = 0; i < balls.size(); i++) {
2837
createBallAnimatorAndStart(balls.get(i), 300 * i);
2938
}
3039
}
3140

41+
@Override
42+
public void stop() {
43+
for (ValueAnimator animator : animators) {
44+
animator.cancel();
45+
}
46+
}
47+
48+
@Override
49+
public void restart() {
50+
stop();
51+
start();
52+
}
53+
3254
private void createBallAnimatorAndStart(Ball ball, int startDelay) {
3355
ValueAnimator valueAnimator = new ValueAnimator();
3456
valueAnimator.setFloatValues(minBallSize, maxBallSize);
@@ -38,6 +60,7 @@ private void createBallAnimatorAndStart(Ball ball, int startDelay) {
3860
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
3961
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
4062
valueAnimator.setStartDelay(startDelay);
63+
animators.add(valueAnimator);
4164
valueAnimator.start();
4265
}
4366

0 commit comments

Comments
 (0)