Skip to content

Commit e2b098d

Browse files
committed
增强FragmentContainerHelper
1 parent 75cb87d commit e2b098d

1 file changed

Lines changed: 42 additions & 18 deletions

File tree

magicindicator/src/main/java/net/lucode/hackware/magicindicator/FragmentContainerHelper.java

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.animation.Animator;
44
import android.animation.AnimatorListenerAdapter;
55
import android.animation.ValueAnimator;
6+
import android.view.animation.AccelerateDecelerateInterpolator;
67
import android.view.animation.Interpolator;
78

89

@@ -14,39 +15,61 @@
1415
public class FragmentContainerHelper extends AnimatorListenerAdapter implements ValueAnimator.AnimatorUpdateListener {
1516
private MagicIndicator mMagicIndicator;
1617
private ValueAnimator mScrollAnimator;
17-
private int mDuration = 200;
18-
private Interpolator mInterpolator;
18+
private int mLastSelectedIndex;
19+
private int mDuration = 150;
20+
private Interpolator mInterpolator = new AccelerateDecelerateInterpolator();
1921

2022
public FragmentContainerHelper(MagicIndicator magicIndicator) {
2123
mMagicIndicator = magicIndicator;
2224
}
2325

2426
public void handlePageSelected(int selectedIndex) {
25-
if (mScrollAnimator == null || !mScrollAnimator.isRunning()) {
26-
dispatchPageScrollStateChanged(ScrollState.SCROLL_STATE_SETTLING);
27+
handlePageSelected(selectedIndex, true);
28+
}
29+
30+
public void handlePageSelected(int selectedIndex, boolean smooth) {
31+
if (mLastSelectedIndex == selectedIndex) {
32+
return;
2733
}
28-
dispatchPageSelected(selectedIndex);
29-
float currentPositionOffsetSum = 0.0f; // position = 0, positionOffset = 0.0f
30-
if (mScrollAnimator != null) {
31-
currentPositionOffsetSum = (Float) mScrollAnimator.getAnimatedValue();
32-
mScrollAnimator.cancel();
33-
mScrollAnimator = null;
34+
if (smooth) {
35+
if (mScrollAnimator == null || !mScrollAnimator.isRunning()) {
36+
dispatchPageScrollStateChanged(ScrollState.SCROLL_STATE_SETTLING);
37+
}
38+
dispatchPageSelected(selectedIndex);
39+
float currentPositionOffsetSum = mLastSelectedIndex;
40+
if (mScrollAnimator != null) {
41+
currentPositionOffsetSum = (Float) mScrollAnimator.getAnimatedValue();
42+
mScrollAnimator.cancel();
43+
mScrollAnimator = null;
44+
}
45+
mScrollAnimator = new ValueAnimator();
46+
mScrollAnimator.setFloatValues(currentPositionOffsetSum, selectedIndex); // position = selectedIndex, positionOffset = 0.0f
47+
mScrollAnimator.addUpdateListener(this);
48+
mScrollAnimator.addListener(this);
49+
mScrollAnimator.setInterpolator(mInterpolator);
50+
mScrollAnimator.setDuration(mDuration);
51+
mScrollAnimator.start();
52+
} else {
53+
dispatchPageSelected(selectedIndex);
54+
if (mScrollAnimator != null && mScrollAnimator.isRunning()) {
55+
dispatchPageScrolled(mLastSelectedIndex, 0.0f, 0);
56+
}
57+
dispatchPageScrollStateChanged(ScrollState.SCROLL_STATE_IDLE);
58+
dispatchPageScrolled(selectedIndex, 0.0f, 0);
3459
}
35-
mScrollAnimator = new ValueAnimator();
36-
mScrollAnimator.setFloatValues(currentPositionOffsetSum, selectedIndex); // position = selectedIndex, positionOffset = 0.0f
37-
mScrollAnimator.addUpdateListener(this);
38-
mScrollAnimator.addListener(this);
39-
mScrollAnimator.setInterpolator(mInterpolator);
40-
mScrollAnimator.setDuration(mDuration);
41-
mScrollAnimator.start();
60+
mLastSelectedIndex = selectedIndex;
4261
}
4362

4463
public void setDuration(int duration) {
4564
mDuration = duration;
4665
}
4766

4867
public void setInterpolator(Interpolator interpolator) {
49-
mInterpolator = interpolator;
68+
if (interpolator == null) {
69+
mInterpolator = new AccelerateDecelerateInterpolator();
70+
} else {
71+
mInterpolator = interpolator;
72+
}
5073
}
5174

5275
private void dispatchPageSelected(int pageIndex) {
@@ -76,5 +99,6 @@ public void onAnimationUpdate(ValueAnimator animation) {
7699
@Override
77100
public void onAnimationEnd(Animator animation) {
78101
mMagicIndicator.onPageScrollStateChanged(ScrollState.SCROLL_STATE_IDLE);
102+
mScrollAnimator = null;
79103
}
80104
}

0 commit comments

Comments
 (0)