一、布局
小圆点形状的生成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>
<?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/ho@R_419_6135@b_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);才能从预设的第一页开始播放。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的android ViewPager实现自动无限轮播和下方向导圆点全部内容,希望文章能够帮你解决android ViewPager实现自动无限轮播和下方向导圆点所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)