简易、常用的轮播图效果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. Scala - 快速学习03 - 基础语法

    1- 变量 变量 mutable variable 在程序运行过程中其值可能发生改变的量 关键词var定义变量,定义时直接进行求值 常量 immutable variable 在程序运行过程中其值不会 ...

  2. 持续集成工具之Jenkins

    Jenkins是一个很好的持续集成工具,不光可以帮助开发进行自动打包,自动验证升级和安装,也可以帮助测试人员定时执行测试任务,或者在开自动打包安装之后自动执行测试任务,实现打包-安装-测试一条线服务, ...

  3. HW2018校招软件类笔试题

    一. 1.题目 输入一个字符串,输出字符串中最长的数字串.如果有多个数字串长度相等且都是最长的,则按照字符串顺序输出最后一个最长的数字串. 2.解答 [code] import java.util.* ...

  4. mysql 开发进阶篇系列 54 权限与安全(账号管理的各种权限操作 下)

    1. 查看权限 -- 如果host值不是%, 就要加上host值,下面查看bkpuser用户权限(6个权限, 限本地连接) SHOW GRANTS FOR bkpuser@localhost; -- ...

  5. mysql 开发基础系列5 运算符

    1. 算术运算符 2.比较运算符 注意NULL值不能用= 运算符 SELECT * FROM t WHERE c =NULL; -- 需要改成 SELECT * FROM t WHERE c IS N ...

  6. 安装mono和monoDevelop开发环境

    我之前用的是Ubuntu10.12版本的linux,一直被软件更新包困扰,总是保存缺少依赖包的问题!总之在网络上找到的软件更新包地址都不能解决问题.后来就用了比较新的TLS版本Ubuntu14.04. ...

  7. 小程序this.setData

    data: { isChecked: [ { key: true },{ key: true },{ key: true} ]} 如上,如果我想动态修改isChecked里面指定某个下标的值怎么办? ...

  8. springboot 与 shiro 整合 (简洁版)

    前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...

  9. docker 构建 https 私有仓库 Registry

    1.安装docker # docker install docker 2.拉取仓库镜像 # docker pull registry 3.生成认证certificate # mkdir ~/certs ...

  10. python datetime模块详解

    datetime是python当中比较常用的时间模块,用于获取时间,时间类型之间转化等,下文介绍两个实用类. 一.datetime.datetime类: datetime.datetime.now() ...