重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家介绍在android中使用ViewPager怎么实现无限轮播功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联是专业的昌黎网站建设公司,昌黎接单;提供网站建设、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行昌黎网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
一、布局
<?xml version="1.0" encoding="utf-8"?>
轮播的ViewPager和向导圆点的 布局文件XML
<?xml version="1.0" encoding="utf-8"?>
二,代码
左右轮播的ViewPager的Adapter
/** * 轮播 viewpager的adapter */ class MyLoopPagerAdapter extends PagerAdapter { private int[] welcomes; private Context mContext; public MyLoopPagerAdapter(int[] welcomes, Context context) { this.welcomes = welcomes; mContext = context; } // //返回实际要显示的图片数+2 @Override public int getCount() { return welcomes.length + 2; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView iv = new ImageView(mContext); int realPosition = (position - 1 + welcomes.length) % welcomes.length; // 设置背景图片 iv.setBackgroundResource(welcomes[realPosition]); container.addView(iv); return iv; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //注意不要remove 否则容易闪屏 // container.removeView((ImageView) object); } }
添加viewpager的addOnPageChangeListener
/** * 循环轮播界面change的 监听器 */ class MyLoopPageChangeListener implements ViewPager.OnPageChangeListener { private ViewPager mViewPager; private LinearLayout mLlDot; private ImageView dotRed; private Handler mHandler; private Runnable mRunnable; /** * 初始化 控件 和 handler * * @param viewPager * @param llDot * @param dotRed */ public MyLoopPageChangeListener(ViewPager viewPager, LinearLayout llDot, ImageView dotRed) { mViewPager = viewPager; this.mLlDot = llDot; this.dotRed = dotRed; initAutoLoop(); } /** * 初始化 自动轮播 handler 和 runnable */ private void initAutoLoop() { mHandler = new Handler() { @Override public void handleMessage(Message msg) { // LogUtils.e("have received a msg"); int curindex = (mViewPager.getCurrentItem() + 1) % (welcomes.length + 2); mViewPager.setCurrentItem(curindex, true); } }; mRunnable = new Runnable() { @Override public void run() { Message message = new Message(); mHandler.sendMessage(message); } }; // 开始 轮播 mHandler.postDelayed(mRunnable, 3 * 1000); } /** * 当页面在滑动了调用 * * @param position 当前页面,即点击滑动的页面 * @param positionOffset 当前页面偏移的百分比 * @param positionOffsetPixels 当前页面偏移的像素位置 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // 获取到 真正图片所在的位置. int realPosition = (position - 1 + welcomes.length) % welcomes.length; // 获取到红点 的 layout 参数 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) dotRed.getLayoutParams(); // 计算两个点之间的距离 int dotDis = mLlDot.getChildAt(1).getLeft() - mLlDot.getChildAt(0).getLeft(); // 计算总共的左边距 int totalLeftMargin = (welcomes.length - 1) * dotDis; // 计算滑动的距离 float dis = realPosition * dotDis + positionOffset * dotDis; // 设置 margin_left 的值, // 如果 position 等于 0 说明正在从第一个图片想最后一个滑动,那么保持 向导的状态为不动 if (position == 0) { params.leftMargin = 0; // 如果滑动距离超过了 最大边距,那么将最大边距赋值给 红点的参数左边距 } else if (dis > totalLeftMargin) { params.leftMargin = totalLeftMargin; // 正常情况 就将滑动的距离 直接赋值 } else { params.leftMargin = (int) dis; } // 设置红点的 参数 dotRed.setLayoutParams(params); // 在position4左滑且左滑positionOffset百分比接近1时,偷偷替换为position1(原本会滑到position5) if (position == welcomes.length && positionOffset > 0.99) { mViewPager.setCurrentItem(1, false); // 在position1右滑且右滑百分比接近0时,偷偷替换为position4(原本会滑到position0) } else if (position == 0 && positionOffset < 0.01) { mViewPager.setCurrentItem(welcomes.length, false); } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { switch (state) { case 0://什么都没做 空闲状态 break; case 1://正在滑动: // 手动滑动 取消自动滑动 mHandler.removeCallbacks(mRunnable); break; case 2://滑动完毕: // 继续 自动滑动 mHandler.postDelayed(mRunnable, 3 * 1000); break; } } }
// 主要的算法参考下图 int realPosition = (position - 1 + welcomes.length) % welcomes.length;
关于在android中使用ViewPager怎么实现无限轮播功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。