Skip to content

Commit 06dd559

Browse files
committed
FragmentContainerHelper支持用Interpolator设置弹性效果
1 parent 0ed9e28 commit 06dd559

8 files changed

Lines changed: 64 additions & 32 deletions

File tree

app/src/main/java/net/lucode/hackware/magicindicatordemo/ext/indicators/CommonPagerIndicator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.view.animation.Interpolator;
99
import android.view.animation.LinearInterpolator;
1010

11+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
1112
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
1213
import net.lucode.hackware.magicindicator.buildins.commonnavigator.model.PositionData;
1314

@@ -53,10 +54,8 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
5354
}
5455

5556
// 计算锚点位置
56-
int currentPosition = Math.min(mPositionDataList.size() - 1, position);
57-
int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1);
58-
PositionData current = mPositionDataList.get(currentPosition);
59-
PositionData next = mPositionDataList.get(nextPosition);
57+
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
58+
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
6059

6160
float leftX;
6261
float nextLeftX;

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
import android.animation.Animator;
44
import android.animation.AnimatorListenerAdapter;
55
import android.animation.ValueAnimator;
6+
import android.annotation.TargetApi;
7+
import android.os.Build;
68
import android.view.animation.AccelerateDecelerateInterpolator;
79
import android.view.animation.Interpolator;
810

11+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.model.PositionData;
12+
913
import java.util.ArrayList;
1014
import java.util.List;
1115

@@ -15,6 +19,7 @@
1519
* Created by hackware on 2016/9/4.
1620
*/
1721

22+
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
1823
public class FragmentContainerHelper {
1924
private List<MagicIndicator> mMagicIndicators = new ArrayList<MagicIndicator>();
2025
private ValueAnimator mScrollAnimator;
@@ -51,6 +56,39 @@ public FragmentContainerHelper(MagicIndicator magicIndicator) {
5156
mMagicIndicators.add(magicIndicator);
5257
}
5358

59+
/**
60+
* IPagerIndicator支持弹性效果的辅助方法
61+
*
62+
* @param positionDataList
63+
* @param index
64+
* @return
65+
*/
66+
public static PositionData getImitativePositionData(List<PositionData> positionDataList, int index) {
67+
if (index >= 0 && index <= positionDataList.size() - 1) { // 越界后,返回假的PositionData
68+
return positionDataList.get(index);
69+
} else {
70+
PositionData result = new PositionData();
71+
PositionData referenceData;
72+
int offset;
73+
if (index < 0) {
74+
offset = index;
75+
referenceData = positionDataList.get(0);
76+
} else {
77+
offset = index - positionDataList.size() + 1;
78+
referenceData = positionDataList.get(positionDataList.size() - 1);
79+
}
80+
result.mLeft = referenceData.mLeft + offset * referenceData.width();
81+
result.mTop = referenceData.mTop;
82+
result.mRight = referenceData.mRight + offset * referenceData.width();
83+
result.mBottom = referenceData.mBottom;
84+
result.mContentLeft = referenceData.mContentLeft + offset * referenceData.width();
85+
result.mContentTop = referenceData.mContentTop;
86+
result.mContentRight = referenceData.mContentRight + offset * referenceData.width();
87+
result.mContentBottom = referenceData.mContentBottom;
88+
return result;
89+
}
90+
}
91+
5492
public void handlePageSelected(int selectedIndex) {
5593
handlePageSelected(selectedIndex, true);
5694
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,16 @@ public void setSkimOver(boolean skimOver) {
140140
mSkimOver = skimOver;
141141
}
142142

143+
public int getTotalCount() {
144+
return mTotalCount;
145+
}
146+
143147
public void setTotalCount(int totalCount) {
144148
mTotalCount = totalCount;
145149
mDeselectedItems.clear();
146150
mLeavedPercents.clear();
147151
}
148152

149-
public int getTotalCount() {
150-
return mTotalCount;
151-
}
152-
153153
public int getCurrentIndex() {
154154
return mCurrentIndex;
155155
}

magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/BezierPagerIndicator.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.view.animation.DecelerateInterpolator;
1010
import android.view.animation.Interpolator;
1111

12+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
1213
import net.lucode.hackware.magicindicator.buildins.ArgbEvaluatorHolder;
1314
import net.lucode.hackware.magicindicator.buildins.UIUtil;
1415
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
@@ -86,17 +87,15 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
8687

8788
// 计算颜色
8889
if (mColors != null && mColors.size() > 0) {
89-
int currentColor = mColors.get(position % mColors.size());
90-
int nextColor = mColors.get((position + 1) % mColors.size());
90+
int currentColor = mColors.get(Math.abs(position) % mColors.size());
91+
int nextColor = mColors.get(Math.abs(position + 1) % mColors.size());
9192
int color = ArgbEvaluatorHolder.eval(positionOffset, currentColor, nextColor);
9293
mPaint.setColor(color);
9394
}
9495

9596
// 计算锚点位置
96-
int currentPosition = Math.min(mPositionDataList.size() - 1, position);
97-
int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1);
98-
PositionData current = mPositionDataList.get(currentPosition);
99-
PositionData next = mPositionDataList.get(nextPosition);
97+
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
98+
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
10099

101100
float leftX = current.mLeft + (current.mRight - current.mLeft) / 2;
102101
float rightX = next.mLeft + (next.mRight - next.mLeft) / 2;

magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.view.animation.Interpolator;
99
import android.view.animation.LinearInterpolator;
1010

11+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
1112
import net.lucode.hackware.magicindicator.buildins.ArgbEvaluatorHolder;
1213
import net.lucode.hackware.magicindicator.buildins.UIUtil;
1314
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
@@ -69,17 +70,15 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
6970

7071
// 计算颜色
7172
if (mColors != null && mColors.size() > 0) {
72-
int currentColor = mColors.get(position % mColors.size());
73-
int nextColor = mColors.get((position + 1) % mColors.size());
73+
int currentColor = mColors.get(Math.abs(position) % mColors.size());
74+
int nextColor = mColors.get(Math.abs(position + 1) % mColors.size());
7475
int color = ArgbEvaluatorHolder.eval(positionOffset, currentColor, nextColor);
7576
mPaint.setColor(color);
7677
}
7778

7879
// 计算锚点位置
79-
int currentPosition = Math.min(mPositionDataList.size() - 1, position);
80-
int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1);
81-
PositionData current = mPositionDataList.get(currentPosition);
82-
PositionData next = mPositionDataList.get(nextPosition);
80+
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
81+
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
8382

8483
float leftX;
8584
float nextLeftX;

magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/TestPagerIndicator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.graphics.RectF;
88
import android.view.View;
99

10+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
1011
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
1112
import net.lucode.hackware.magicindicator.buildins.commonnavigator.model.PositionData;
1213

@@ -54,10 +55,8 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
5455
}
5556

5657
// 计算锚点位置
57-
int currentPosition = Math.min(mPositionDataList.size() - 1, position);
58-
int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1);
59-
PositionData current = mPositionDataList.get(currentPosition);
60-
PositionData next = mPositionDataList.get(nextPosition);
58+
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
59+
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
6160

6261
mOutRect.left = current.mLeft + (next.mLeft - current.mLeft) * positionOffset;
6362
mOutRect.top = current.mTop + (next.mTop - current.mTop) * positionOffset;

magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/TriangularPagerIndicator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.view.animation.Interpolator;
99
import android.view.animation.LinearInterpolator;
1010

11+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
1112
import net.lucode.hackware.magicindicator.buildins.UIUtil;
1213
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
1314
import net.lucode.hackware.magicindicator.buildins.commonnavigator.model.PositionData;
@@ -75,10 +76,8 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
7576
}
7677

7778
// 计算锚点位置
78-
int currentPosition = Math.min(mPositionDataList.size() - 1, position);
79-
int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1);
80-
PositionData current = mPositionDataList.get(currentPosition);
81-
PositionData next = mPositionDataList.get(nextPosition);
79+
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
80+
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
8281

8382
float leftX = current.mLeft + (current.mRight - current.mLeft) / 2;
8483
float rightX = next.mLeft + (next.mRight - next.mLeft) / 2;

magicindicator/src/main/java/net/lucode/hackware/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.view.animation.Interpolator;
99
import android.view.animation.LinearInterpolator;
1010

11+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
1112
import net.lucode.hackware.magicindicator.buildins.UIUtil;
1213
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
1314
import net.lucode.hackware.magicindicator.buildins.commonnavigator.model.PositionData;
@@ -59,10 +60,8 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
5960
}
6061

6162
// 计算锚点位置
62-
int currentPosition = Math.min(mPositionDataList.size() - 1, position);
63-
int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1);
64-
PositionData current = mPositionDataList.get(currentPosition);
65-
PositionData next = mPositionDataList.get(nextPosition);
63+
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
64+
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
6665

6766
mRect.left = current.mContentLeft - mHorizontalPadding + (next.mContentLeft - current.mContentLeft) * mEndInterpolator.getInterpolation(positionOffset);
6867
mRect.top = current.mContentTop - mVerticalPadding;

0 commit comments

Comments
 (0)