Android(安卓)ViewPager2实现无限轮播
Android轮播控件
全新升级,基于ViewPager2实现无限轮播功能。可以自定义indicator,需自定义实现 Indicator 接口,内置了的IndicatorView,支持五种动画切换。支持传入RecyclerView.Adapter 即可实现无限轮播,支持任何ReyclerView.Apdater框架,集成使用请参考Sample。
- 支持自动轮播
- 支持一屏三页
- 支持自定义Indicator
- 支持自定义view
- 支持数据刷新
- 支持垂直滚动
- 支持任意RecyclerView.adapter,RecyclerView的使用方式。
- 良好的代码封装,更多优化请参考代码实现。
项目地址前往项目地址
效果图
点击下载 banner.apk 体验
基本使用的功能,请下载apk体验更流畅 |
---|
描述 | 普通样式 | 两边缩放 |
---|---|---|
一屏三页 |
IndicatorView | IndicatorStyle |
---|---|
INDICATOR_CIRCLE | INDICATOR_CIRCLE_RECT |
INDICATOR_BEZIER | INDICATOR_DASH |
INDICATOR_BIG_CIRCLE | |
效果图 | 1 | 2 |
---|---|---|
收集更多的效果 | ||
Indicator查看simple代码 | ||
… |
使用步骤
Step 1.依赖banner
项目地址前往项目地址
项目地址前往项目地址
项目地址前往项目地址
Step 2.xml
<com.to.aboomy.pager2.Banner android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="150dp"/>
Step 3.自定义RecyclerView.Adapter
//自定义adapterpublic class ImageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> //或者使用其他三方框架,都是支持的,如:BRVAHpublic class ImageAdapter extends BaseQuickAdapter<String, BaseViewHolder> { public ImageAdapter() { super(R.layout.item_image); } @Override protected void convert(@NonNull BaseViewHolder helper, String item) { Glide.with(mContext) .load(item) .into((ImageView) helper.getView(R.id.img)); }}
Step 4.在页面中使用Banner
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); banner = findViewById(R.id.banner); //使用内置Indicator IndicatorView indicator = new IndicatorView(this) .setIndicatorColor(Color.DKGRAY) .setIndicatorSelectorColor(Color.WHITE); //创建adapter ImageAdapter adapter = new ImageAdapter(); //传入RecyclerView.Adapter 即可实现无限轮播 banner.setIndicator(indicator) .setAdapter(adapter); }
简单设置一屏三页效果
//设置左右页面露出来的宽度及item与item之间的宽度.setPageMargin(UIUtil.dip2px(this, 20), UIUtil.dip2px(this, 10))//内置ScaleInTransformer,设置切换缩放动画.setPageTransformer(true, new ScaleInTransformer())
###
关于ViewPager切换动画
Sample中集成了以下两个ViewPager切换动画,请运行Sample查看动画效果,参考需要的ViewPagerTransform放到项目中,或者根据需求进行自定义。
ViewPagerTransforms
MagicViewPager
如何自定义Indicator
/** * 可以实现该接口,自定义Indicator 可参考内置的{@link IndicatorView} */public interface Indicator { /** * 当数据初始化完成时调用 * * @param pagerCount pager数量 */ void initIndicatorCount(int pagerCount); /** * 返回一个View,添加到banner中 */ View getView(); /** * banner是一个RelativeLayout,设置banner在RelativeLayout中的位置,可以是任何地方 */ RelativeLayout.LayoutParams getParams(); void onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels); void onPageSelected(int position); void onPageScrollStateChanged(int state);}//举个栗子public class IndicatorView extends View implements Indicator{ @Override public void initIndicatorCount(int pagerCount) { this.pagerCount = pagerCount; setVisibility(pagerCount > 1 ? VISIBLE : GONE); requestLayout(); } @Override public View getView() { return this; } /** * 控制Indicator在Banner中的位置,开发者自行实现 */ @Override public RelativeLayout.LayoutParams getParams() { if (params == null) { params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); params.addRule(RelativeLayout.CENTER_HORIZONTAL); params.bottomMargin = dip2px(10); } return params; } /** * banner切换时同步回调的三个方法 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { selectedPage = position; offset = positionOffset; invalidate(); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { }}
Banner提供的方法介绍,banner未提供任何自定义属性
|方法名|描述|
|—|---|
|setPageTransformer(ViewPager2.PageTransformer transformer)|设置viewpager2的自定义动画,支持多个添加|
setOuterPageChangeListener(ViewPager2.OnPageChangeCallback listener)|设置viewpager2的滑动监听
|setAutoTurningTime(long autoTurningTime)|设置自动轮播时长
|setAutoPlay(boolean autoPlay)|设置是否自动轮播,大于1页可以轮播
|setIndicator(Indicator indicator)|设置indicator
|setIndicator(Indicator indicator, boolean attachToRoot)|设置indicator
|setAdapter(@Nullable RecyclerView.Adapter adapter)|加载数据,此方法时开始轮播的方法,请再最后调用
|setAdapter(@Nullable RecyclerView.Adapter adapter, int startPosition)|重载方法,设置轮播的起始位置
|isAutoPlay()|是否无限轮播
|getCurrentPager()|获取viewPager2当前位置
|startTurning()|开始轮播
|stopTurning()|停止轮播
|setPageMargin(int multiWidth, int pageMargin)|设置一屏多页
|setPageMargin(int leftWidth, int rightWidth, int pageMargin)|设置一屏多页,方法重载
|setOffscreenPageLimit(int limit)|同viewPager2用法
|setOrientation(@ViewPager2.Orientation int orientation)|设置viewpager2滑动方向|
|ViewPager2 getViewPager2()|获取viewpager2|
|RecyclerView.Adapter getAdapter()|获取apdater|
|||
内置IndicatorView使用方法介绍,没有提供任何自定义属性
方法名 | 描述 |
---|---|
setIndicatorRadius(float indicatorRadius) | 设置圆点半径 |
setIndicatorSpacing(float indicatorSpacing) | 设置圆点间距 |
setIndicatorStyle(@IndicatorStyle int indicatorStyle) | 设置圆点切换动画,内置五种切换动画,请参考Sample |
setIndicatorColor(@ColorInt int indicatorColor) | 设置默认的圆点颜色 |
setIndicatorSelectorColor(@ColorInt int indicatorSelectorColor) | 设置选中的圆点颜色 |
setParams(RelativeLayout.LayoutParams params) | 设置IndicatorView在banner中的位置,默认底部居中,距离底部10dp,请参考Sample |
setIndicatorRatio(float indicatorRatio) | 设置indicator比例,拉伸圆为矩形,设置越大,拉伸越长,默认1.0 |
setIndicatorSelectedRadius(float indicatorSelectedRadius) | 设置选中的圆角,默认和indicatorRadius值一致,可单独设置选中的点大小 |
setIndicatorSelectedRatio(float indicatorSelectedRatio) | 设置选中圆比例,拉伸圆为矩形,控制该比例,默认比例和indicatorRatio一致,默认值1.0 |
总结
xiexie ni de guāng gù ! 喜欢的朋友轻轻右上角赏个star,您的鼓励会给我持续更新的动力。
更多相关文章
- 用Eclipse开发Android项目(转)
- android各module的依赖版本统一
- Android(安卓)Dialog 设置圆角无效
- android bluedroid调试
- Notification探险
- android 通过jdbc访问mysql数据库--(含android studio 配置)通过测
- Android(安卓)Design Library之四:BottomSheetDialog
- Android布局之二——Relative Layout
- 【攻克Android(安卓)(43)】WebView (网络视图)