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" )
3336public 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 }
0 commit comments