在很多软件中,我们都会看到图片轮播的效果。如图:

首先在布局文件中添加viewpager控件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="wrap_content"android:layout_height="300dp"/></LinearLayout>

设置适配器

 PagerAdapter pagerAdapter = new PagerAdapter() {@Overridepublic int getCount() {//返回一个比较大的值,目的是为了实现无限轮播return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view==object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {position = position%imageIds.length;ImageView imageView = new ImageView(MainActivity.this);imageView.setImageResource(imageIds[position]);imageView.setScaleType(ImageView.ScaleType.FIT_XY);container.addView(imageView);mList.add(imageView);return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(mList.get(position));}};

利用 Timer 实现每隔 2s 向 Handler 发送message来更新图片

Handler mHandler  = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1:index++;viewPager.setCurrentItem(index);}}};
 timer = new Timer();//创建Timer对象//执行定时任务timer.schedule(new TimerTask() {@Overridepublic void run() {//首先判断是否需要轮播if (isContinue) {mHandler.sendEmptyMessage(1);}}},2000,2000);//延迟2秒,每隔2秒发一次消息

//手指按下和划动的时候停止图片的轮播

  /*** 根据当前触摸事件判断是否要轮播*/View.OnTouchListener onTouchListener  = new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){//手指按下和划动的时候停止图片的轮播case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:isContinue = false;break;default:isContinue = true;}return false;}};

MainActivity.class

public class MainActivity extends AppCompatActivity {private ViewPager viewPager;//图片资源private int[] imageIds = {R.drawable.d1,R.drawable.d2,R.drawable.d3,R.drawable.d4};//存放图片的数组private List<ImageView> mList;//当前索引位置以及上一个索引位置private int index = 0;//是否需要轮播标志private boolean isContinue = true;//定时器,用于实现轮播private Timer timer;Handler mHandler  = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1:index++;viewPager.setCurrentItem(index);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewpager);mList = new ArrayList<>();viewPager.setAdapter(pagerAdapter);viewPager.addOnPageChangeListener(onPageChangeListener);viewPager.setOnTouchListener(onTouchListener);timer = new Timer();//创建Timer对象//执行定时任务timer.schedule(new TimerTask() {@Overridepublic void run() {//首先判断是否需要轮播,是的话我们才发消息if (isContinue) {mHandler.sendEmptyMessage(1);}}},2000,2000);//延迟2秒,每隔2秒发一次消息}/*** 根据当前触摸事件判断是否要轮播*/View.OnTouchListener onTouchListener  = new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){//手指按下和划动的时候停止图片的轮播case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:isContinue = false;break;default:isContinue = true;}return false;}};/***根据当前选中的页面设置按钮的选中*/ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {index = position;//当前位置赋值给索引setCurrentDot(index%imageIds.length);}@Overridepublic void onPageScrollStateChanged(int state) {}};/*** 设置对应位置按钮的状态* @param i 当前位置*/private void setCurrentDot(int i) {}PagerAdapter pagerAdapter = new PagerAdapter() {@Overridepublic int getCount() {//返回一个比较大的值,目的是为了实现无限轮播return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view==object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {position = position%imageIds.length;ImageView imageView = new ImageView(MainActivity.this);imageView.setImageResource(imageIds[position]);imageView.setScaleType(ImageView.ScaleType.FIT_XY);container.addView(imageView);mList.add(imageView);return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(mList.get(position));}};
}

效果如图:

上面实现了基本的轮播效果。

现在我们给他加上选中的小圆点效果

未选中的小圆点

point_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="@color/colorAccent"/><size android:height="10dp" android:width="10dp"/>
</shape>

选中的小圆点

point_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="@android:color/white"/><size android:height="10dp" android:width="10dp"/>
</shape>

选择器

rg_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_enabled="false" android:drawable="@drawable/point_default"/><item android:state_enabled="true" android:drawable="@drawable/point_select"/>
</selector>

在主布局中添加RadioGroup,并将主布局改为RelativeLayout(或者FrameLayout).

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"android:layout_height="300dp"xmlns:android="http://schemas.android.com/apk/res/android" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="wrap_content"android:layout_height="300dp"/><RadioGroupandroid:layout_centerHorizontal="true"android:layout_above="@id/viewpager"android:layout_alignParentBottom="true"android:id="@+id/point_group"android:layout_width="wrap_content"android:layout_marginBottom="10dp"android:orientation="horizontal"android:layout_height="wrap_content"/></RelativeLayout>

初始化RadioGroup

  private RadioGroup group;group = (RadioGroup) findViewById(R.id.point_group);

根据图片个数初始化按钮

/*** 根据图片个数初始化按钮* @param length*/private void initGroup(int length) {for(int i = 0;i<length;i++){ImageView imageview = new ImageView(this);imageview.setImageResource(R.drawable.rg_selector);//设置背景选择器imageview.setPadding(20,0,0,0);//设置每个按钮之间的间距//将按钮依次添加到RadioGroup中group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);//默认选中第一个按钮,因为默认显示第一张图片group.getChildAt(0).setEnabled(false);}}

根据当前选中的页面设置按钮的选中

/***根据当前选中的页面设置按钮的选中*/ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {index = position;//当前位置赋值给索引setCurrentDot(index%imageIds.length);}@Overridepublic void onPageScrollStateChanged(int state) {}};

设置对应位置按钮的状态

/*** 设置对应位置按钮的状态* @param i 当前位置*/private void setCurrentDot(int i) {if(group.getChildAt(i)!=null){group.getChildAt(i).setEnabled(false);//当前按钮选中}if(group.getChildAt(preIndex)!=null){group.getChildAt(preIndex).setEnabled(true);//上一个取消选中preIndex = i;//当前位置变为上一个,继续下次轮播}}

MainActivity.class

public class MainActivity extends AppCompatActivity {private ViewPager viewPager;private RadioGroup group;//图片资源private int[] imageIds = {R.drawable.d1,R.drawable.d2,R.drawable.d3,R.drawable.d4};//存放图片的数组private List<ImageView> mList;//当前索引位置以及上一个索引位置private int index = 0,preIndex = 0;//是否需要轮播标志private boolean isContinue = true;//定时器,用于实现轮播private Timer timer;Handler mHandler  = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1:index++;System.out.println("==========index: "+index);viewPager.setCurrentItem(index);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewpager);group = (RadioGroup) findViewById(R.id.point_group);mList = new ArrayList<>();viewPager.setAdapter(pagerAdapter);viewPager.setPageMargin(50);viewPager.addOnPageChangeListener(onPageChangeListener);viewPager.setOnTouchListener(onTouchListener);initGroup(imageIds.length);timer = new Timer();//创建Timer对象//执行定时任务timer.schedule(new TimerTask() {@Overridepublic void run() {//首先判断是否需要轮播,是的话我们才发消息if (isContinue) {mHandler.sendEmptyMessage(1);}}},2000,2000);//延迟2秒,每隔2秒发一次消息}/*** 根据图片个数初始化按钮* @param length*/private void initGroup(int length) {for(int i = 0;i<length;i++){ImageView imageview = new ImageView(this);imageview.setImageResource(R.drawable.rg_selector);//设置背景选择器imageview.setPadding(20,0,0,0);//设置每个按钮之间的间距//将按钮依次添加到RadioGroup中group.addView(imageview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);//默认选中第一个按钮,因为默认显示第一张图片group.getChildAt(0).setEnabled(false);}}/*** 根据当前触摸事件判断是否要轮播*/View.OnTouchListener onTouchListener  = new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){//手指按下和划动的时候停止图片的轮播case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:isContinue = false;break;default:isContinue = true;}return false;}};/***根据当前选中的页面设置按钮的选中*/ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {index = position;//当前位置赋值给索引setCurrentDot(index%imageIds.length);}@Overridepublic void onPageScrollStateChanged(int state) {}};/*** 设置对应位置按钮的状态* @param i 当前位置*/private void setCurrentDot(int i) {if(group.getChildAt(i)!=null){group.getChildAt(i).setEnabled(false);//当前按钮选中}if(group.getChildAt(preIndex)!=null){group.getChildAt(preIndex).setEnabled(true);//上一个取消选中preIndex = i;//当前位置变为上一个,继续下次轮播}}PagerAdapter pagerAdapter = new PagerAdapter() {@Overridepublic int getCount() {//返回一个比较大的值,目的是为了实现无限轮播return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view==object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {position = position%imageIds.length;ImageView imageView = new ImageView(MainActivity.this);imageView.setImageResource(imageIds[position]);imageView.setScaleType(ImageView.ScaleType.FIT_XY);container.addView(imageView);mList.add(imageView);return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(mList.get(position));}};
}

效果如图:

最后再说一点小变化:

viewPager.setPageMargin   //设置页与页之间的间距

viewPager.setPageMargin(50);

PagerAdapter里的getPageWidth方法   //一屏显示多个子界面

 @Overridepublic float getPageWidth(int position) {return 0.8f;}

如图:

ViewPager简单使用(四)实现图片轮播相关推荐

  1. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

  2. Android---flipper实现图片轮播

    前言 其实,ViewPager+Fragment也可以实现图片轮播,但是这次我主要用了Filpper来实现. 布局 <LinearLayout xmlns:android="http: ...

  3. 原生Js_简易图片轮播模板

    功能:图片自动循环轮播,通过点击"上一张","下一张"按钮来控制图片的切换 <!DOCTYPE html> <html><head ...

  4. viewpager实现花式图片轮播

    效果图 首先,让我们了解下什么是viewpager: 这个大致意思是:这个布局管理器允许用户左右翻转并传递页面的数据,你想要的视图可以通过pagerAdapter来实现. 布局文件: <Fram ...

  5. Android使用ViewPager实现图片轮播和手势滑动

    ViewPager常用来实现图片的轮播,比如淘宝首页,会把一些促销的商品的图片和描述信息来回的播放,这就是典型的使用ViewPager实现的. ViewPager属于布局管理器,允许用户通过页面翻转查 ...

  6. html+轮播图下标跳转代码,最简单的JavaScript图片轮播代码(两种方法)

    通过改变每个图片的opacity属性: 素材图片: 代码一: 最简单的轮播广告 body, div, ul, li { margin: ; padding: ; } ul { list-style-t ...

  7. Android之——史上最简单图片轮播广告效果实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48049913 如今的Android开发需求越来越来多,实现效果越来越酷炫,很多An ...

  8. 网页制作使用CSS样式制作轮播教程,静态网页设计与开发 1.案例——CSS3制作图片轮播图 (4)使用纯CSS3代码实现简单的图片轮播——分步骤实现.docx...

    使用纯CSS3代码实现简单的图片轮播 设计思路: 以5张图片为例: 1.基本布局: 通过设置每张图片的尺寸和父容器的尺寸,从而将5张图片横向并排放入一个div容器(#photos)内.所有图片设置统一 ...

  9. javascript实现图片轮播_第2章 第9节 JavaScript(四)

    ● 知道哪些ES6,ES7的语法 参考回答: promise,await/async,let.const.块级作用域.箭头函数 ● promise和await/async的关系 参考回答: 都是异步编 ...

最新文章

  1. tkmbatis 日志_mybatis打印sql日志
  2. Linux查看端口号是否使用
  3. leetcode:242 : 有效的字母异位词
  4. 解决错误: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
  5. 自动打开WINDWOS远程控制的注册表文件
  6. idea设置放大缩小_手机里竟然自带quot;放大镜quot;,很远也感觉近在眼前,真的涨知识了...
  7. 【我的物联网成长记10】五分钟了解物联网SIM卡【华为云技术分享】
  8. Node.js 用户注册功能的实现
  9. 8种寻找机器学习数据集的方法 | 附数据集资源
  10. Stm32 CubeMx安装和配置Cube.ai教程
  11. Android给力模拟器,秒杀原生模拟器到渣
  12. c语言编程简单教学,C语言入门教程-最简单的C程序
  13. ip地址解析,ip归属地识别
  14. matlab 折射率椭球,折射率椭球详解.ppt
  15. 计算机键盘功能教案,键盘认识教案
  16. 备案网站未正规绑定服务器,网站备案对收录到底有没有影响
  17. SAP PS 第9节 合并采购申请、组合WBS之详解
  18. mac 不显示 外接屏幕_苹果电脑外接显示器显示不出来 - 卡饭网
  19. 佛系推荐《骡子》是经典又好看的动作电影毋庸置疑
  20. 视频编辑软件编辑星海外英文网站上线

热门文章

  1. INSPIRED启示录 读书笔记 - 第17章 产品人物角色
  2. 《信息与编码》考试复习笔记6----第六章连续信源熵和信道容量(考点在连续信道容量)
  3. Java 实现替换文件的指定内容
  4. 将域名直接映射到网站首页(通过域名即可访问网站首页)
  5. 金蝶软件系统管理与维护常见问题
  6. 学习并掌握结构化写作方法,提高写作能力 ——结构化写作学习笔记(4)
  7. DelayQueue使用示例之KTV包厢记时
  8. Python自动化开发【1】:Python简介和入门
  9. html引入腾讯地图导航
  10. Flask学习笔记总结(一)