简易、常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V 

 

需求如下:

不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最后一张图片自动切换后的为第一张图片,手指触摸可以滑动。

 

思路:

初始化Viewpager和轮播点之后  , 开启一个子线程,每隔3秒判断一次 当前位置是不是轮播图数据个数的最后一个位置,是的话切换到第一张图片,不是的话切换到下一张图片

 

一、先看布局文件,根容器为相对布局,里面放一个ViewPager控件,并在ViewPager 控件右下角位置放一个线性布局,用于动态添加轮播点

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xqx.magikare.viewpagerdemo.MainActivity"> <!--轮播图区域-->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<!--轮播图-->
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_height="200dp"
android:layout_width="match_parent"
/>
<!--位置点父容器-->
<LinearLayout
android:id="@+id/lyDot"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
></LinearLayout> </RelativeLayout> </RelativeLayout>

二、Activity 几个生命周期以及关键方法

1、initData()方法

 private void initData() {
viewPagerData = new ArrayList<>();
ImageView imageView = new ImageView(this);
/*添加图片资源,实际开发中为for循环即可 ,这里demo麻烦了*/
// 第一张图片
imageView.setBackgroundResource(R.mipmap.aaa);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
viewPagerData.add(imageView); // 第二张图片
ImageView imageView2 = new ImageView(this);
imageView2.setBackgroundResource(R.mipmap.bbb);
imageView2.setScaleType(ImageView.ScaleType.FIT_XY);
viewPagerData.add(imageView2); // 第三张图片
ImageView imageView3 = new ImageView(this);
imageView3.setBackgroundResource(R.mipmap.ccc);
imageView3.setScaleType(ImageView.ScaleType.FIT_XY);
viewPagerData.add(imageView3);
}

  

2、initDots()方法

   /**
* 动态创建轮播图位置点显示
*/
private void initDots() {
// 动态添加轮播图位置点 , 默认第0个位置 为当前轮播图的颜色
for (int i = ; i < viewPagerData.size(); i++) {
imageView = new ImageView(this);
if (i==) {
imageView.setBackgroundColor(Color.parseColor(SelectColor));
}else{
imageView.setBackgroundColor(Color.parseColor(unSelectColor));
}
imageView.setLayoutParams(new LinearLayout.LayoutParams(dip2px(), dip2px()));
setMargins(imageView,dip2px(),,dip2px(),);
lyDot.addView(imageView);
}
}

3、initViewPager()方法

private void initViewpager() {
//数据适配器
viewPagerAdapter = new PagerAdapter() {
private int mChildCount = ; @Override
public void notifyDataSetChanged() {
mChildCount = getCount();
super.notifyDataSetChanged();
} @Override
public int getItemPosition(Object object) {
if (mChildCount > ) {
mChildCount--;
return POSITION_NONE;
}
return super.getItemPosition(object);
} @Override
//获取当前窗体界面数
public int getCount() {
// TODO Auto-generated method stub
return viewPagerData.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} //是从ViewGroup中移出当前View
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(viewPagerData.get(arg1));
} //返回一个对象,这个对象表明了PagerAdapter适配器选择哪个对象放在当前的ViewPager中
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(viewPagerData.get(arg1));
return viewPagerData.get(arg1);
}
}; viewpager.setAdapter(viewPagerAdapter);
viewpager.setCurrentItem();
viewpager.setOffscreenPageLimit();
viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
} @Override
public void onPageSelected(int position) {
currentPosition = position;
for (int i = ; i < lyDot.getChildCount(); i++) {
if (i == currentPosition) {
lyDot.getChildAt(i).setBackgroundColor(Color.parseColor("#1d2939"));
} else {
lyDot.getChildAt(i).setBackgroundColor(Color.parseColor("#476990"));
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
// 没有滑动的时候 切换页面
}
});
}

4、initHandler()方法

private void initHandler() {
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == ) {
if (currentPosition==viewPagerData.size()-){ // 如果当前位置是轮播图的最后一个位置,则调到轮播图数据源的第一张图片
currentPosition = ;
viewpager.setCurrentItem(,false);
}else{
currentPosition ++; // 否则切换到下一张图片
viewpager.setCurrentItem(currentPosition,true);
}
}
}
};
}

5、autoViewPager()方法

     /**
* 开启子线程,实现3000毫秒 切换一次 ,viewpager自动播放
*/
private void autoViewPager() {
new Thread() {
@Override
public void run() {
super.run();
while (actIsAlive) {
try {
sleep();
handler.sendEmptyMessage();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}

-----------------------------------------------------------------------------------------------------------

GitHub Demo 地址

Android项目实战(四十七):轮播图效果Viewpager的更多相关文章

  1. 第二百五十一节,Bootstrap项目实战--响应式轮播图

    Bootstrap项目实战--响应式轮播图 学习要点: 1.响应式轮播图 本节课我们要在导航条的下方做一张轮播图,自动播放最新的重要动态. 一.响应式轮播图 响应式轮播图 第一步,设置轮播器区域car ...

  2. Bootstrap 学习笔记 项目实战 响应式轮播图

    左右两个箭头可以随浏览器缩放进行移动 保持在图片中间 Html代码: <!DOCTYPE html> <html lang="zh-cn"> <hea ...

  3. (转载)Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow

    Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow   这是一张QQ空间说说详情的截图. 分析: 1.点击右上角三个点的图标,在界面底部弹出一个区域,这个 ...

  4. 小程序实践(二):swiper组件实现轮播图效果

    swiper组件类似于Android中的ViewPager,实现类似轮播图的效果,相对于Android的Viewpager,swiper实现起来更加方便,快捷. 效果图: 首先看下swiper支持的属 ...

  5. js 实现淘宝无缝轮播图效果,可更改配置参数 带完整版解析代码[slider.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS写淘宝无缝轮播图效果 需求分析: ...

  6. jQuey实现轮播图效果

    再平常的浏览器页面,轮播图都是必不可缺少的一个板块,在这总结了一下轮播图基本的一些样式 首先介绍一下,本文实现的轮播图的基本效果: 1. 3s自动切换图片,图片切换时提示点跟随切换 2. 鼠标划到图片 ...

  7. js原生实现轮播图效果(面向对象编程)

    面向对象编程js原生实现轮播图效果 1.先看效果图 2.需要实现的功能: 自动轮播 点击左右箭头按钮无缝轮播 点击数字按钮切换图片 分析:如何实现无缝轮播? 在一个固定大小的相框里有一个ul标签,其长 ...

  8. 云南农职《JavaScript交互式网页设计》 综合机试试卷②——实现轮播图效果

    一.语言和环境 实现语言:HTML,CSS,JavaScript,JQuery. 开发环境:HBuilder. 二.题目(100分): 使用JQuery淡入淡出动画,实现轮播图效果 每隔2秒钟切换一张 ...

  9. js实现轮播图效果(附源码)--原生js的应用

    1.js实现轮播图效果 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

随机推荐

  1. 带你一文了解Python中的运算符

    运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...

  2. 本地Oracle客户端11g升级12c导致PowerCenter无法连接ODBC数据源

    问题: 本地Oracle客户端由11g-32bit升级为12c-64bit时,在PowerCenter Designer使用原来的ODBC连接导入数据库表时,发生如下错误: 原因: 原oracle11 ...

  3. redis 删除大key集合的方法

    redis大key,这里指的是大的集合数据类型,如(set/hash/list/sorted set),一个key包含很多元素.由于redis是单线程,在删除大key(千万级别的set集合)的时候,或 ...

  4. Git+Hexo搭建个人博客详细过程

    通过Git+Hexo搭建的个人博客地址:https://liangh.top/ 1.安装Node.js.配置好Node.js环境.安装Git和配置好Git环境,打开cmd命令行,成功界面如下 2.安装 ...

  5. 【面试篇】寒冬求职季之你必须要懂的原生JS(中)

    互联网寒冬之际,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力. 一年前,也许你搞清楚闭包,this,原型链,就能获得认可.但是现在 ...

  6. ionic3 实现扫码功能

    ionic3 通过插件phonegap-plugin-barcodescanner,调用机器硬件摄像头实现扫码功能. 首先当然先了解下 phonegap-plugin-barcodescanner,这 ...

  7. 译《The Part-Time Parliament》——终于读懂了Paxos协议!

    最近的考古发现表明,在Paxos小岛上,尽管兼职议会成员都有逍遥癖,但议会模式仍然起作用.他们依旧保持了一致的会议记录,尽管他们频繁的进出会议室并且他们的信使还很健忘.Paxon议会协议提供了一种新方 ...

  8. hashMap的hashCode() 和equal()的使用

    hashMap的hashCode() 和equa()的使用 在java的集合中,判断两个对象是否相等的规则是: ,判断两个对象的hashCode是否相等 如果不相等,认为两个对象也不相等,完毕 如果相 ...

  9. HashMap在JDK1.7中可能出现的并发问题

    在JDK1.7及以前中,如果在并发环境中使用HashMap保存数据,有可能会产生死循环的问题,造成cpu的使用率飙升.之所以会发生该问题,实际上就是因为HashMap中的扩容问题. HashMap的实 ...

  10. uml活动图

    uml是程序员需要掌握一个重要工具,特别在研究hadoop(http://www.iigrowing.cn/hadoop)系统中,有很多相关的uml图形需要绘制,为了方便大家了解uml,在网络上找了些 ...