Skip to content

Commit 52f01af

Browse files
committed
shrink anim complete
1 parent 6eb2067 commit 52f01af

2 files changed

Lines changed: 90 additions & 71 deletions

File tree

Loadingbutton/src/main/java/com/flod/loadingbutton/LoadingButton.java

Lines changed: 86 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
* 3、收缩后的大小随loading的大小决定
2929
* 4、设置loading 可以设置为上下左右
3030
* 5、重复start的动画处理
31+
* 6、恢复动画还没结束时,点击收缩会变成恢复的状态
32+
* 7、正在显示EndDrawable时,再次点击start会变成恢复状态的加载
33+
* 先执行 beginShrinkAnim(true) 后执行 beginShrinkAnim(false);
3134
*/
3235
@SuppressWarnings("UnusedReturnValue,SameParameterValue")
3336
public class LoadingButton extends DrawableTextView {
@@ -143,39 +146,22 @@ public void onAnimationStart(Animator animation) {
143146
}
144147
}
145148

146-
@Override
147-
public void onAnimationCancel(Animator animation) {
148-
super.onAnimationCancel(animation);
149-
isAnimRunning = false;
150-
// Log.d("Animation", "onAnimationCancel");
151-
}
152-
153149
@Override
154150
public void onAnimationEnd(Animator animation) {
155151
//Log.d("Animation", "onAnimationEnd");
156152
if (mOnLoadingListener != null) {
157153
mOnLoadingListener.onShrinkEnd(isShrinkAnimReverse);
158154
}
159-
//Log.d("Animation", "isAnimRunning= " + isAnimRunning);
160-
if (isAnimRunning) {
161-
if (!isShrinkAnimReverse) {
162-
//收缩结束
163-
startLoading();
164-
} else {
165-
//恢复结束
166-
restoreStatus();
167-
setEnabled(true);
168-
isAnimRunning = false;
169-
}
155+
if (!isShrinkAnimReverse) {
156+
//收缩结束
157+
startLoading();
170158
} else {
159+
//恢复结束
171160
stopLoading();
172161
restoreStatus();
173162
setEnabled(true);
174163
isAnimRunning = false;
175164
}
176-
177-
//Log.d("Animation", "isAnimRunning= " + isAnimRunning);
178-
//Log.d("Animation", "isShrinkAnimReverse= " + isShrinkAnimReverse);
179165
isShrinkAnimReverse = !isShrinkAnimReverse;
180166
}
181167

@@ -184,6 +170,40 @@ public void onAnimationEnd(Animator animation) {
184170

185171
}
186172

173+
public void start() {
174+
Log.d("Animation", "start");
175+
if (enableShrink) {
176+
177+
//TODO 如果mEndDrawable mEndDrawable.isShowing 且准备执行 beginShrinkAnim(false); 就会冲突
178+
if (mEndDrawable != null && mEndDrawable.isShowing) {
179+
//想办法先让上一个动画先结束
180+
mEndDrawable.cancel();
181+
}
182+
beginShrinkAnim(true, false);
183+
} else {
184+
startLoading();
185+
}
186+
187+
}
188+
189+
public void end() {
190+
if (mEndDrawable == null) {
191+
if (mOnLoadingListener != null) {
192+
mOnLoadingListener.onLoadingEnd();
193+
}
194+
beginShrinkAnim(false, false);
195+
} else {
196+
if (mShrinkAnimator.isRunning()) {
197+
//结束正在收缩的动画
198+
mShrinkAnimator.end();
199+
}
200+
stopLoading();
201+
Log.d("Animation", "end");
202+
mEndDrawable.show();
203+
}
204+
205+
}
206+
187207
/**
188208
* 保存收缩前的状态
189209
*/
@@ -209,18 +229,23 @@ private void restoreStatus() {
209229
}
210230

211231

212-
private void beginShrinkAnim(boolean isShrink) {
213-
232+
private void beginShrinkAnim(boolean isShrink, boolean lastFrame) {
214233
Log.d("Animation", "isShrink" + isShrink);
215234
if (enableShrink) {
216-
//isShrinkAnimReverse = !isShrink;
217-
mShrinkAnimator.cancel();
235+
if (mShrinkAnimator.isRunning()) {
236+
//如果上一个动画还在执行,就结束到最后一帧
237+
mShrinkAnimator.end();
238+
}
218239
if (isShrink) {
219240
mShrinkAnimator.start();
220241
} else {
221242
mShrinkAnimator.reverse();
222243
}
223244

245+
if (lastFrame) {
246+
mShrinkAnimator.end();
247+
}
248+
224249
}
225250
}
226251

@@ -323,6 +348,8 @@ private class EndDrawable {
323348
private ObjectAnimator mAppearAnimator;
324349
private long duration;
325350
private float animValue;
351+
private boolean isShowing;
352+
private Runnable mRunnable;
326353

327354

328355
private EndDrawable(@DrawableRes int id) {
@@ -332,35 +359,55 @@ private EndDrawable(@DrawableRes int id) {
332359
mCirclePath = new Path();
333360
mAppearAnimator = ObjectAnimator.ofFloat(this, "animValue", 1.0f);
334361
mAppearAnimator.setDuration(DEFAULT_APPEAR_DURATION);
362+
mRunnable = new Runnable() {
363+
@Override
364+
public void run() {
365+
Log.d("Animation", "onEndDrawableAnimationEnd");
366+
setAnimValue(0);
367+
if (enableShrink && isAnimRunning) {
368+
beginShrinkAnim(false, false);
369+
} else {
370+
setEnabled(true);
371+
isAnimRunning = false;
372+
}
373+
isShowing = false;
374+
}
375+
};
335376
mAppearAnimator.addListener(new AnimatorListenerAdapter() {
336377
@Override
337378
public void onAnimationEnd(Animator animation) {
338379
if (mOnLoadingListener != null) {
339380
mOnLoadingListener.onLoadingEnd();
340381
}
341-
postDelayed(new Runnable() {
342-
@Override
343-
public void run() {
344-
Log.d("Animation", "onEndDrawableAnimationEnd");
345-
setAnimValue(0);
346-
if (enableShrink && isAnimRunning) {
347-
beginShrinkAnim(false);
348-
} else {
349-
setEnabled(true);
350-
isAnimRunning = false;
351-
}
352-
}
353-
}, duration);
382+
if (isShowing) {
383+
postDelayed(mRunnable, duration);
384+
}
354385
}
355386
});
356387

357388
}
358389

359390
private void show() {
360-
mAppearAnimator.cancel();
391+
//如果仍在显示中,结束动画
392+
if (isShowing) {
393+
cancel();
394+
}
361395
mAppearAnimator.start();
396+
isShowing = true;
397+
}
398+
399+
private void cancel() {
400+
isShowing = false;
401+
if (mAppearAnimator.isRunning()) {
402+
//出现中
403+
mAppearAnimator.end();
404+
}
405+
getHandler().removeCallbacks(mRunnable);
406+
beginShrinkAnim(false, true);
407+
setAnimValue(0);
362408
}
363409

410+
364411
private void hide() {
365412
mAppearAnimator.cancel();
366413
mAppearAnimator.reverse();
@@ -503,36 +550,6 @@ public void setOnLoadingListener(OnLoadingListener onLoadingListener) {
503550
}
504551

505552

506-
public void start() {
507-
Log.d("Animation", "start");
508-
if (enableShrink)
509-
beginShrinkAnim(true);
510-
else {
511-
startLoading();
512-
}
513-
514-
}
515-
516-
public void stop() {
517-
518-
if (mEndDrawable == null) {
519-
if (mOnLoadingListener != null) {
520-
mOnLoadingListener.onLoadingEnd();
521-
}
522-
beginShrinkAnim(false);
523-
} else {
524-
if (mShrinkAnimator.isRunning()) {
525-
isAnimRunning = false;
526-
mShrinkAnimator.end();
527-
isShrinkAnimReverse = true;
528-
}
529-
//mShrinkAnimator.cancel();
530-
Log.d("Animation", "stop");
531-
mEndDrawable.show();
532-
}
533-
534-
}
535-
536553
private void cancel() {
537554

538555
}

app/src/main/java/com/flod/hardloadingbutton/MainActivity.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import androidx.appcompat.app.AppCompatActivity;
77

8+
import com.flod.loadingbutton.DrawableTextView;
89
import com.flod.loadingbutton.LoadingButton;
910

1011
public class MainActivity extends AppCompatActivity {
@@ -23,7 +24,7 @@ public void onClick(View v) {
2324
if (!mBoolean) {
2425
view.start();
2526
} else
26-
view.stop();
27+
view.end();
2728

2829
}
2930
});
@@ -40,7 +41,8 @@ public void onLoadingEnd() {
4041
}
4142

4243
});
43-
/*
44+
45+
/*
4446
final DrawableTextView view1 = findViewById(R.id.test3);
4547
view1.setOnClickListener(new View.OnClickListener() {
4648
@Override

0 commit comments

Comments
 (0)