Skip to content

Commit 9e0d4a2

Browse files
committed
Add hide and show way
1 parent babe537 commit 9e0d4a2

File tree

2 files changed

+75
-2
lines changed

2 files changed

+75
-2
lines changed

app/src/main/java/com/wang/avi/sample/IndicatorActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2626
}
2727

2828
public void hideClick(View view) {
29-
avi.setVisibility(View.GONE);
29+
avi.hide();
3030
}
3131

3232
public void showClick(View view) {
33-
avi.setVisibility(View.VISIBLE);
33+
avi.show();
3434
}
3535
}

library/src/main/java/com/wang/avi/AVLoadingIndicatorView.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.graphics.drawable.Drawable;
1111
import android.os.Build;
1212
import android.support.annotation.NonNull;
13+
import android.support.v4.widget.ContentLoadingProgressBar;
1314
import android.text.TextUtils;
1415
import android.util.AttributeSet;
1516
import android.util.Log;
@@ -19,6 +20,39 @@ public class AVLoadingIndicatorView extends View {
1920

2021
private static final String TAG="AVLoadingIndicatorView";
2122

23+
private static final int MIN_SHOW_TIME = 500; // ms
24+
private static final int MIN_DELAY = 500; // ms
25+
26+
private long mStartTime = -1;
27+
28+
private boolean mPostedHide = false;
29+
30+
private boolean mPostedShow = false;
31+
32+
private boolean mDismissed = false;
33+
34+
private final Runnable mDelayedHide = new Runnable() {
35+
36+
@Override
37+
public void run() {
38+
mPostedHide = false;
39+
mStartTime = -1;
40+
setVisibility(View.GONE);
41+
}
42+
};
43+
44+
private final Runnable mDelayedShow = new Runnable() {
45+
46+
@Override
47+
public void run() {
48+
mPostedShow = false;
49+
if (!mDismissed) {
50+
mStartTime = System.currentTimeMillis();
51+
setVisibility(View.VISIBLE);
52+
}
53+
}
54+
};
55+
2256
int mMinWidth;
2357
int mMaxWidth;
2458
int mMinHeight;
@@ -127,6 +161,37 @@ public void setIndicator(@NonNull String indicatorName){
127161
}
128162
}
129163

164+
public void hide() {
165+
mDismissed = true;
166+
removeCallbacks(mDelayedShow);
167+
long diff = System.currentTimeMillis() - mStartTime;
168+
if (diff >= MIN_SHOW_TIME || mStartTime == -1) {
169+
// The progress spinner has been shown long enough
170+
// OR was not shown yet. If it wasn't shown yet,
171+
// it will just never be shown.
172+
setVisibility(View.GONE);
173+
} else {
174+
// The progress spinner is shown, but not long enough,
175+
// so put a delayed message in to hide it when its been
176+
// shown long enough.
177+
if (!mPostedHide) {
178+
postDelayed(mDelayedHide, MIN_SHOW_TIME - diff);
179+
mPostedHide = true;
180+
}
181+
}
182+
}
183+
184+
public void show() {
185+
// Reset the start time.
186+
mStartTime = -1;
187+
mDismissed = false;
188+
removeCallbacks(mDelayedHide);
189+
if (!mPostedShow) {
190+
postDelayed(mDelayedShow, MIN_DELAY);
191+
mPostedShow = true;
192+
}
193+
}
194+
130195
@Override
131196
protected boolean verifyDrawable(Drawable who) {
132197
return who == mIndicator
@@ -301,6 +366,7 @@ public void drawableHotspotChanged(float x, float y) {
301366
protected void onAttachedToWindow() {
302367
super.onAttachedToWindow();
303368
startAnimation();
369+
removeCallbacks();
304370
}
305371

306372
@Override
@@ -309,6 +375,13 @@ protected void onDetachedFromWindow() {
309375
// This should come after stopAnimation(), otherwise an invalidate message remains in the
310376
// queue, which can prevent the entire view hierarchy from being GC'ed during a rotation
311377
super.onDetachedFromWindow();
378+
removeCallbacks();
312379
}
313380

381+
private void removeCallbacks() {
382+
removeCallbacks(mDelayedHide);
383+
removeCallbacks(mDelayedShow);
384+
}
385+
386+
314387
}

0 commit comments

Comments
 (0)