一、布局

小圆点形状的生成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);才能从预设的第一页开始播放。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# viewpager无限轮播
# viewpager小圆点导航
# viewpager自动轮播
# Android首页无限轮播功能的示例代码
# Android使用viewpager实现自动无限轮播图
# android实现banner轮播图无限轮播效果
# Android viewpager无限轮播获取网络图片功能
# Android图片无限轮播的实现代码
# Android仿京东快报无限轮播效果
# 滑到
# 第一个
# 不动
# 就将
# 第一页
# 什么都没
# 大家多多
# 就可以
# 圆点
# 超过了
# 小圆点
# layout_height
# ll_dot
# horizontal
# ImageView
# orientation
# LinearLayout
# src
# hometab_vp
# wrap_content
相关文章:
如何做网站制作流程,*游戏网站怎么搭建?
制作公司内部网站有哪些,内网如何建网站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在宝塔面板创建新站点?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
c# await 一个已经完成的Task会发生什么
Android自定义listview布局实现上拉加载下拉刷新功能
C#如何序列化对象为XML XmlSerializer用法
建站之星CMS五站合一模板配置与SEO优化指南
如何快速搭建安全的FTP站点?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何用PHP工具快速搭建高效网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何在万网开始建站?分步指南解析
如何用低价快速搭建高质量网站?
如何快速建站并高效导出源代码?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何高效利用亚马逊云主机搭建企业网站?
手机网站制作与建设方案,手机网站如何建设?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过山东自助建站平台快速注册域名?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
,在苏州找工作,上哪个网站比较好?
常州自助建站费用包含哪些项目?
企业微网站怎么做,公司网站和公众号有什么区别?
如何快速搭建高效WAP手机网站吸引移动用户?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何快速生成专业多端适配建站电话?
制作旅游网站html,怎样注册旅游网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
seo网站制作优化,网站SEO优化步骤有哪些?
高防服务器:AI智能防御DDoS攻击与数据安全保障
东莞专业制作网站的公司,东莞大学生网的网址是什么?
网站制作员失业,怎样查看自己网站的注册者?
,网站推广常用方法?
如何彻底删除建站之星生成的Banner?
建站之星安装后如何自定义网站颜色与字体?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
南宁网站建设制作定制,南宁网站建设可以定制吗?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
行程制作网站有哪些,第三方机票电子行程单怎么开?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何高效配置IIS服务器搭建网站?
设计网站制作公司有哪些,制作网页教程?
香港服务器WordPress建站指南:SEO优化与高效部署策略
定制建站如何定义?其核心优势是什么?
python的本地网站制作,如何创建本地站点?
黑客如何通过漏洞一步步攻陷网站服务器?
*请认真填写需求信息,我们会在24小时内与您取得联系。