android ViewPager实现自动无限轮播和下方向导圆点

一、布局

小圆点形状的生成shape.xml文件

使用空心还是实心的把对应的注释去掉就可以了.

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" android:useLevel="false"> <!-- 实心圆 <solid android:color="#F00"/> --> <!-- 空心圆 <stroke android:width="1dp" android:color="@android:color/black"/> --> <size android:width="8dp" android:height="8dp"/> </shape>

轮播的ViewPager和向导圆点的 布局文件XML

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="200dp"> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/hometab_vp" android:layout_width="match_parent" android:layout_height="200dp"> </android.support.v4.view.ViewPager> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" > <LinearLayout android:id="@+id/ll_dot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/shape_guide_dot_default"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:src="@drawable/shape_guide_dot_default"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:src="@drawable/shape_guide_dot_default"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:src="@drawable/shape_guide_dot_default"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:src="@drawable/shape_guide_dot_default"/> </LinearLayout> <ImageView android:id="@+id/dot_red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/shape_guide_dot_solid"/> </RelativeLayout> </RelativeLayout>

二,代码

左右轮播的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;

由下图可以发现,应该初始化ViewPager.setCurrentItem(1);才能从预设的第一页开始播放。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-11-10 06:50:23

android ViewPager实现自动无限轮播和下方向导圆点的相关文章

Android自动滚动 轮播循环的ViewPager

主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用.顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题. 项目已开源Android Auto Scroll ViewPager@Github,欢迎star和fork. 更多自动滚动轮播的开源项目可见:自动滚动 ViewPager. 示例APK可从这些地址下载:Google Play, 360手机助手, 百度手机助手, 小米应用商店, 豌豆荚 示例代码地

Android viewpager无限轮播获取网络图片功能

本文实例为大家分享了viewpager无限轮播获取网络图片的具体代码,供大家参考,具体内容如下 话不多说直接上代码,你们都懂的 小圆点属性 dot_focused.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="recta

Android图片无限轮播的实现代码_Android

本文实例为大家分享了AnAndroid图片无限轮播的具体代码,供大家参考,具体内容如下 public class MainActivity extends Activity { private ViewPager viewPager; private LinearLayout ll_dot; private String[] imageUrls = new String[] { "yun_qi_img/block.gif", "yun_qi_img/block.gif&quo

Android图片无限轮播的实现代码

本文实例为大家分享了AnAndroid图片无限轮播的具体代码,供大家参考,具体内容如下 public class MainActivity extends Activity { private ViewPager viewPager; private LinearLayout ll_dot; private String[] imageUrls = new String[] { "http://pic8.nipic.com/20100701/5290458_114840036316_2.jpg&

手把手教你用ViewPager自定义实现Banner轮播_Android

欢迎大家关注Android开源网络框架NoHttp:https://github.com/yanzhenjie/NoHttp  我们在实际开发中,很多App都会在做一个广告轮播器(可能是图片,可能是其他View),很多同学都是使用别人封装好的或者直接使用ViewPager自己来改,但是有人可能并不理解里面的原理,或者有人遇到了手势滑动冲突.我们今天就用150行代码实现一自定义的广告轮播器并不干扰原来View滑动事件. 本例代码源码及Demo传送门 效果演示 需求分析.解决方案 轮播器最重要的几个

iOS开发UI篇—无限轮播(循环利用)

一.无限轮播 1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollView,在UIScrollView上面添加多个imageView,然后设置imageView的图片,和scrollView的滚动范围. 以前的做法: 一般而言,轮播的广告或者是图片数量都不会太多(3~5张).所以,并不会太多的去考虑性能问题.但是如果图片过多(比如有16张图片,就需要创建16个imageView),那么就不得不考虑性能问题了

Android开发之滑动图片轮播标题焦点_Android

先给大家这是下效果图: 谷歌提供的v4包,ViewPager 在布局文件中,先添加<android.support.v4.view.ViewPager/>控件,这个只是轮播的区域 在布局文件中,布置标题描述部分 线性布局,竖向排列,背景色黑色半透明,这个布局和上面的ViewPager底部对齐layout_alignBottom="@id/xxx" <TextView/>居中显示, 小点部分,先放过空的LinearLayout,id是ll_points在代码中对其

IOS使用UICollectionView实现无限轮播效果_IOS

一.案例演示 本案例Demo演示的是一个首页轮播的案例,支持手动轮播和自动轮播.知识点主要集中在UICollectionView和NSTimer的使用. 二.知识储备 2.1.UICollectionView横向布局 只需要设置UICollectionViewFlowLayout的scrollDirection为UICollectionViewScrollDirectionHorizontal即可. 2.2.NSTimer的基本使用 NSTimer的初始化: 复制代码 代码如下:  + (NST

Android开发之滑动图片轮播标题焦点

先给大家这是下效果图: 谷歌提供的v4包,ViewPager 在布局文件中,先添加<android.support.v4.view.ViewPager/>控件,这个只是轮播的区域 在布局文件中,布置标题描述部分 线性布局,竖向排列,背景色黑色半透明,这个布局和上面的ViewPager底部对齐layout_alignBottom="@id/xxx" <TextView/>居中显示, 小点部分,先放过空的LinearLayout,id是ll_points在代码中对其