|
@@ -12,6 +12,7 @@ import androidx.annotation.Nullable;
|
|
|
import androidx.viewpager.widget.ViewPager;
|
|
|
|
|
|
import android.util.AttributeSet;
|
|
|
+import android.util.Log;
|
|
|
import android.view.MotionEvent;
|
|
|
import android.view.View;
|
|
|
import android.view.ViewGroup;
|
|
@@ -22,6 +23,7 @@ import com.zhpan.bannerview.annotation.AIndicatorSlideMode;
|
|
|
import com.zhpan.bannerview.annotation.AIndicatorStyle;
|
|
|
import com.zhpan.bannerview.annotation.APageStyle;
|
|
|
import com.zhpan.bannerview.annotation.ATransformerStyle;
|
|
|
+import com.zhpan.bannerview.annotation.Visibility;
|
|
|
import com.zhpan.bannerview.constants.IndicatorSlideMode;
|
|
|
import com.zhpan.bannerview.constants.IndicatorStyle;
|
|
|
import com.zhpan.bannerview.constants.PageStyle;
|
|
@@ -52,53 +54,56 @@ import static com.zhpan.bannerview.transform.pagestyle.ScaleInTransformer.DEFAUL
|
|
|
public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout implements
|
|
|
ViewPager.OnPageChangeListener {
|
|
|
|
|
|
- private CatchViewPager mViewPager;
|
|
|
-
|
|
|
- private List<T> mList;
|
|
|
- // 页面切换时间间隔
|
|
|
private int interval;
|
|
|
- // 当前页面位置
|
|
|
+
|
|
|
private int currentPosition;
|
|
|
- // 是否正在循环
|
|
|
+
|
|
|
private boolean isLooping;
|
|
|
- // 是否开启循环
|
|
|
+
|
|
|
private boolean isCanLoop;
|
|
|
- // 是否开启自动播放
|
|
|
+
|
|
|
private boolean isAutoPlay = false;
|
|
|
- // 是否显示指示器
|
|
|
- private boolean showIndicator = true;
|
|
|
- // Indicator gravity
|
|
|
+
|
|
|
private int gravity;
|
|
|
- // 未选中时指示器颜色
|
|
|
+
|
|
|
private int indicatorNormalColor;
|
|
|
- // 选中时的指示器颜色
|
|
|
+
|
|
|
private int indicatorCheckedColor;
|
|
|
- // 指示器宽度/直径
|
|
|
+
|
|
|
private int normalIndicatorWidth;
|
|
|
- // 选中时指示宽度/直径
|
|
|
+
|
|
|
private int checkedIndicatorWidth;
|
|
|
- // 页面点击事件监听
|
|
|
+
|
|
|
private OnPageClickListener mOnPageClickListener;
|
|
|
- // 轮播指示器
|
|
|
+
|
|
|
private IIndicator mIndicatorView;
|
|
|
- // 存放IndicatorView的容器
|
|
|
+
|
|
|
private RelativeLayout mRelativeLayout;
|
|
|
- // Item 间隔
|
|
|
+
|
|
|
private int mPageMargin;
|
|
|
- // 一屏多页时,显露其它page的width
|
|
|
+
|
|
|
private int mRevealWidth;
|
|
|
- // 指示器Style样式
|
|
|
+
|
|
|
private int mIndicatorStyle;
|
|
|
- // IndicatorView的滑动模式
|
|
|
+
|
|
|
private int mIndicatorSlideMode;
|
|
|
|
|
|
+ private CatchViewPager mViewPager;
|
|
|
+
|
|
|
+ private List<T> mList;
|
|
|
+
|
|
|
private HolderCreator<VH> holderCreator;
|
|
|
-// private BannerScroller mScroller;
|
|
|
+
|
|
|
private int indicatorGap;
|
|
|
+
|
|
|
private int indicatorHeight;
|
|
|
+
|
|
|
private boolean isCustomIndicator;
|
|
|
+
|
|
|
private int mPageStyle = PageStyle.NORMAL;
|
|
|
|
|
|
+ private IndicatorMargin mIndicatorMargin;
|
|
|
+
|
|
|
private Handler mHandler = new Handler();
|
|
|
|
|
|
private Runnable mRunnable = new Runnable() {
|
|
@@ -117,10 +122,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- private IndicatorMargin mIndicatorMargin;
|
|
|
-
|
|
|
-// private OnPageSelectedListener mOnPageSelectedListener;
|
|
|
-
|
|
|
public BannerViewPager(Context context) {
|
|
|
this(context, null);
|
|
|
}
|
|
@@ -182,7 +183,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
*/
|
|
|
private void initData() {
|
|
|
if (mList.size() > 0) {
|
|
|
- if (mList.size() > 1 && showIndicator) {
|
|
|
+ if (mList.size() > 1) {
|
|
|
if (isCustomIndicator && null != mIndicatorView) {
|
|
|
initIndicator(mIndicatorView);
|
|
|
} else {
|
|
@@ -240,22 +241,24 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
* 构造指示器
|
|
|
*/
|
|
|
private void initIndicator(IIndicator indicatorView) {
|
|
|
- mRelativeLayout.removeAllViews();
|
|
|
- mRelativeLayout.addView((View) indicatorView);
|
|
|
mIndicatorView = indicatorView;
|
|
|
- setIndicatorViewMargin();
|
|
|
- RelativeLayout.LayoutParams layoutParams =
|
|
|
- (RelativeLayout.LayoutParams) ((View) indicatorView).getLayoutParams();
|
|
|
- switch (gravity) {
|
|
|
- case CENTER:
|
|
|
- layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
|
|
|
- break;
|
|
|
- case START:
|
|
|
- layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
|
|
|
- break;
|
|
|
- case END:
|
|
|
- layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
|
|
|
- break;
|
|
|
+ if (((View) indicatorView).getParent() == null) {
|
|
|
+ mRelativeLayout.removeAllViews();
|
|
|
+ mRelativeLayout.addView((View) indicatorView);
|
|
|
+ setIndicatorViewMargin();
|
|
|
+ RelativeLayout.LayoutParams layoutParams =
|
|
|
+ (RelativeLayout.LayoutParams) ((View) indicatorView).getLayoutParams();
|
|
|
+ switch (gravity) {
|
|
|
+ case CENTER:
|
|
|
+ layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
|
|
|
+ break;
|
|
|
+ case START:
|
|
|
+ layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
|
|
|
+ break;
|
|
|
+ case END:
|
|
|
+ layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -305,15 +308,15 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void setMultiPageStyle(boolean cascading, float scale) {
|
|
|
+ private void setMultiPageStyle(boolean overlap, float scale) {
|
|
|
mPageMargin = mPageMargin == 0 ? DpUtils.dp2px(20) : mPageMargin;
|
|
|
mRevealWidth = mRevealWidth == 0 ? DpUtils.dp2px(20) : mRevealWidth;
|
|
|
setClipChildren(false);
|
|
|
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mViewPager.getLayoutParams();
|
|
|
params.leftMargin = mPageMargin + mRevealWidth;
|
|
|
params.rightMargin = mPageMargin + mRevealWidth;
|
|
|
- mViewPager.setCascadingStyle(cascading);
|
|
|
- mViewPager.setPageMargin(cascading ? -mPageMargin : mPageMargin);
|
|
|
+ mViewPager.setOverlapStyle(overlap);
|
|
|
+ mViewPager.setPageMargin(overlap ? -mPageMargin : mPageMargin);
|
|
|
mViewPager.setOffscreenPageLimit(2);
|
|
|
setPageTransformer(new ScaleInTransformer(scale));
|
|
|
}
|
|
@@ -321,16 +324,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
@Override
|
|
|
public void onPageSelected(int position) {
|
|
|
currentPosition = position;
|
|
|
- if (showIndicator && mIndicatorView != null) {
|
|
|
+ if (mIndicatorView != null) {
|
|
|
mIndicatorView.onPageSelected(getRealPosition(position));
|
|
|
}
|
|
|
-// if (mOnPageSelectedListener != null)
|
|
|
-// mOnPageSelectedListener.onPageSelected(getRealPosition(position));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onPageScrollStateChanged(int state) {
|
|
|
- if (showIndicator && mIndicatorView != null) {
|
|
|
+ if (mIndicatorView != null) {
|
|
|
mIndicatorView.onPageScrollStateChanged(state);
|
|
|
}
|
|
|
if (isCanLoop) {
|
|
@@ -357,7 +358,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
|
|
|
@Override
|
|
|
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
|
|
- if (showIndicator && mIndicatorView != null) {
|
|
|
+ if (mIndicatorView != null) {
|
|
|
mIndicatorView.onPageScrolled(getRealPosition(position), positionOffset, positionOffsetPixels);
|
|
|
}
|
|
|
}
|
|
@@ -442,7 +443,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 设置圆角ViewPager
|
|
|
*
|
|
@@ -607,9 +607,16 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
|
|
|
/**
|
|
|
* @param showIndicator 是否显示轮播指示器
|
|
|
+ * @deprecated Use {@link #setIndicatorVisibility(int)} instead.
|
|
|
*/
|
|
|
+ @Deprecated
|
|
|
public BannerViewPager<T, VH> showIndicator(boolean showIndicator) {
|
|
|
- this.showIndicator = showIndicator;
|
|
|
+ mRelativeLayout.setVisibility(showIndicator ? VISIBLE : GONE);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public BannerViewPager<T, VH> setIndicatorVisibility(@Visibility int visibility) {
|
|
|
+ mRelativeLayout.setVisibility(visibility);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
@@ -649,7 +656,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
if (customIndicator instanceof View) {
|
|
|
isCustomIndicator = true;
|
|
|
mIndicatorView = customIndicator;
|
|
|
-// initIndicator((View) customIndicator);
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
@@ -676,7 +682,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
mList.clear();
|
|
|
mList.addAll(list);
|
|
|
initData();
|
|
|
- if (showIndicator && null != mIndicatorView) {
|
|
|
+ if (null != mIndicatorView) {
|
|
|
mIndicatorView.setPageSize(mList.size());
|
|
|
mIndicatorView.notifyDataChanged();
|
|
|
}
|
|
@@ -740,11 +746,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
- // public BannerViewPager<T, VH> setOnPageSelectedListener(OnPageSelectedListener onPageSelectedListener) {
|
|
|
-// mOnPageSelectedListener = onPageSelectedListener;
|
|
|
-// return this;
|
|
|
-// }
|
|
|
-
|
|
|
/**
|
|
|
* 获取BannerViewPager中封装的ViewPager,用于设置BannerViewPager未暴露出来的接口,
|
|
|
* 比如setCurrentItem等。
|
|
@@ -761,10 +762,10 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
|
|
|
public BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) {
|
|
|
mIndicatorMargin = new IndicatorMargin();
|
|
|
- mIndicatorMargin.setBottom(bottom);
|
|
|
- mIndicatorMargin.setLeft(left);
|
|
|
- mIndicatorMargin.setTop(top);
|
|
|
- mIndicatorMargin.setRight(right);
|
|
|
+ mIndicatorMargin.bottom = bottom;
|
|
|
+ mIndicatorMargin.left = left;
|
|
|
+ mIndicatorMargin.top = top;
|
|
|
+ mIndicatorMargin.right = right;
|
|
|
return this;
|
|
|
}
|
|
|
|
|
@@ -784,46 +785,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
|
|
|
void onPageClick(int position);
|
|
|
}
|
|
|
|
|
|
- public static class IndicatorMargin {
|
|
|
- private int left;
|
|
|
- private int right;
|
|
|
- private int top;
|
|
|
- private int bottom;
|
|
|
-
|
|
|
- public int getLeft() {
|
|
|
- return left;
|
|
|
- }
|
|
|
-
|
|
|
- public void setLeft(int left) {
|
|
|
- this.left = left;
|
|
|
- }
|
|
|
-
|
|
|
- public int getRight() {
|
|
|
- return right;
|
|
|
- }
|
|
|
-
|
|
|
- public void setRight(int right) {
|
|
|
- this.right = right;
|
|
|
- }
|
|
|
-
|
|
|
- public int getTop() {
|
|
|
- return top;
|
|
|
- }
|
|
|
-
|
|
|
- public void setTop(int top) {
|
|
|
- this.top = top;
|
|
|
- }
|
|
|
-
|
|
|
- public int getBottom() {
|
|
|
- return bottom;
|
|
|
- }
|
|
|
-
|
|
|
- public void setBottom(int bottom) {
|
|
|
- this.bottom = bottom;
|
|
|
- }
|
|
|
+ private static class IndicatorMargin {
|
|
|
+ private int left, right, top, bottom;
|
|
|
}
|
|
|
-
|
|
|
-// public interface OnPageSelectedListener {
|
|
|
-// void onPageSelected(int position);
|
|
|
-// }
|
|
|
}
|