布局文件

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <RelativeLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="200dp" >
  9.  
  10. <android.support.v4.view.ViewPager
  11. android:id="@+id/vp"
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent" />
  14.  
  15. <LinearLayout
  16. android:id="@+id/ll_point"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_alignParentBottom="true"
  20. android:layout_centerInParent="true"
  21. android:layout_marginBottom="20dp"
  22. android:orientation="horizontal" />
  23. </RelativeLayout>
  24.  
  25. </RelativeLayout>

相关代码

  1. public class MainActivity extends Activity {
  2.  
  3. private ViewPager mViewPager;
  4. private LinearLayout mLlPoint;
  5. private MyAdapter mAdapter;
  6.  
  7. private int[] ids = {R.drawable.a1,R.drawable.a2,R.drawable.a3};
  8. private List<ImageView> mImages;
  9. private int lastPos;
  10. private boolean isRunning;
  11.  
  12. private Handler mHandler = new Handler() {
  13. public void handleMessage(android.os.Message msg) {
  14. switch(msg.what){
  15. case 0:
  16.  
  17. mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
  18.  
  19. if (isRunning) {
  20. mHandler.sendEmptyMessageDelayed(0,3000);
  21. }
  22.  
  23. break;
  24.  
  25. default:
  26. break;
  27. }
  28. };
  29. };
  30.  
  31. @Override
  32. protected void onCreate(Bundle savedInstanceState) {
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.activity_main);
  35.  
  36. initView();
  37. initData();
  38.  
  39. mAdapter = new MyAdapter();
  40. mViewPager.setAdapter(mAdapter);
  41. mViewPager.addOnPageChangeListener(new PagerChnageListener());
  42. mViewPager.setCurrentItem((mImages.size()) * 1000);
  43.  
  44. isRunning = true;
  45. mHandler.sendEmptyMessageDelayed(0,3000);
  46. }
  47.  
  48. private void initView() {
  49. mViewPager = (ViewPager)findViewById(R.id.vp);
  50. mLlPoint = (LinearLayout)findViewById(R.id.ll_point);
  51. }
  52.  
  53. private void initData() {
  54.  
  55. mImages = new ArrayList<ImageView>();
  56.  
  57. for (int i = 0;i < ids.length;i++) {
  58. ImageView iv = new ImageView(this);
  59. iv.setBackgroundResource(ids[i]);
  60. mImages.add(iv);
  61.  
  62. View view = new View(this);
  63. view.setBackgroundResource(R.drawable.point_selector);
  64. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(Utils.dip2px(this,10),
  65. Utils.dip2px(this,10));
  66. if (i != 0) {
  67. params.leftMargin = 20;
  68. view.setEnabled(false);
  69. }else {
  70. view.setEnabled(true);
  71. }
  72. view.setLayoutParams(params);
  73. mLlPoint.addView(view);
  74. }
  75. }
  76.  
  77. class MyAdapter extends PagerAdapter {
  78.  
  79. @Override
  80. public int getCount() {
  81. return Integer.MAX_VALUE;
  82. }
  83.  
  84. @Override
  85. public boolean isViewFromObject(View arg0,Object arg1) {
  86. return arg0 == arg1;
  87. }
  88.  
  89. @Override
  90. public Object instantiateItem(ViewGroup container,int position) {
  91. ImageView view = mImages.get(position % mImages.size());
  92.  
  93. // 增加异常扑捉防止空白页
  94. try {
  95. ((ViewPager)container).addView(view,0);
  96. }catch(Exception e) {
  97. e.printStackTrace();
  98. }
  99. return view;
  100. }
  101.  
  102. @Override
  103. public void destroyItem(ViewGroup container,int position,Object object) {
  104. // 防止2/3个出现BUG
  105. // container.removeView(mImages.get(position % mImages.size()));
  106. }
  107. }
  108.  
  109. class PagerChnageListener implements OnPageChangeListener {
  110.  
  111. /* state: 0空闲,1是滑行中,2加载完毕 */
  112. @Override
  113. public void onPageScrollStateChanged(int state) {
  114. switch(state){
  115. case 0:
  116. isRunning = true;
  117. break;
  118. case 1:
  119. isRunning = false;
  120. break;
  121. case 2:
  122. isRunning = true;
  123. break;
  124.  
  125. default:
  126. break;
  127. }
  128. }
  129.  
  130. @Override
  131. public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
  132.  
  133. }
  134.  
  135. @Override
  136. public void onPageSelected(int position) {
  137. int pos = position % mImages.size();
  138. mLlPoint.getChildAt(lastPos).setEnabled(false);
  139. mLlPoint.getChildAt(pos).setEnabled(true);
  140. lastPos = pos;
  141. }
  142. }
  143.  
  144. @Override
  145. protected void onDestroy() {
  146. super.onDestroy();
  147. isRunning = false;
  148. mHandler.removeCallbacksAndMessages(null);
  149. }
  150. }

 

 效果图

ViewPager—02图片无限轮播的更多相关文章

  1. Android实现广告页图片无限轮播

    一.概述 对于一个联网的Android应用, 首页广告无限轮播基本已经成为标配了. 那么它是怎么实现的呢? 有几种实现方式呢? 二.无限轮播的实现 1.最常规的手段是用 ViewPager来实现 2. ...

  2. iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)

    这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...

  3. iOS开发之ImageView复用实现图片无限轮播

    在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...

  4. iOS 两种不同的图片无限轮播

    代码地址如下:http://www.demodashi.com/demo/11608.html 前记 其实想写这个关于无限轮播的记录已经很久很久了,只是没什么时间,这只是一个借口,正如:时间就像海绵, ...

  5. ViewPager实现图片的轮播

    在app中图片的轮播显示可以说是非常常见的实现效果了,其实现原理不过是利用ViewPager,然后利用handler每隔一定的时间将ViewPager的currentItem设置为当前item的pos ...

  6. iOS实现图片无限轮播之使用第三方库SDCycleScrollView(转)

    下载链接:github不断更新地址:https://github.com/gsdios/SDCycleScrollView #import "ViewController.h" # ...

  7. ViewPager实现无限轮播踩坑记

    最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...

  8. ViewPager无限轮播与自定义切换动画

    一直在寻求一个能用得长久的ViewPager,寻寻觅觅终于发现,ViewPager有这一个就够了. 注:并非完全原创 先看一下效果: 淡入淡出: 旋转: 无限轮播的ViewPager 主要设计思路(以 ...

  9. iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView

    iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43      阅读:630      评论:0      收藏:0   ...

随机推荐

  1. XML与JavaScript知识

    什么是XMLHttpRequest 对象? 答:XMLHttpRequest 对象用于在后台与服务器交换数据,它是开发者的梦想,因为它能够:1.在不重新加载页面的情况下更新网页:2.在页面已加载后从服 ...

  2. 关于ReentrantLock和Condition的用法

    这篇博客是过年后的第一篇博客,2.13正式上班,之前在家休年假.上班第一天公司说有个紧急的项目需要上线,所以我们连续加了两个星期的班,直到上个周六还在加班,终于成功上线了.今天是2月的最后的一天,继续 ...

  3. EWS 通过SubscribeToPullNotifications订阅Exchange新邮件提醒

    摘要 在ews中提供了一种拉通知的方式获取服务端邮件的操作,通过这种方式客户端可以订阅该通知,在邮箱有变化的时候,可以收到通知. 工作方式 EWS 通知是在订阅的基础上处理的.通常是一个订阅每个邮箱, ...

  4. Hibernate一对一主键映射

    Hibernate一对一主键映射                        ------------------------------                            -- ...

  5. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  6. failed (1113: No mapping for the Unicode character exists in the target multi-byte code page), client: 127.0.0.1...

    nginx部署网站后,访问域名,网页显示  500 Internal Server Error ,经查看发现nginx的error.log中有报错: failed (1113: No mapping ...

  7. webpack配置React开发环境(上)

    Webpack 是一个前端资源加载/打包工具,我们部门的一条主要技术栈就是Webpack+React+ES6+node,虽然之前自己做个人项目也接触好多次Webpack,但是自己并没有研读总结过Web ...

  8. 《学习记录》ng2-bootstrap中的component使用教程

    前序: 现在angular2已经除了集成的angular-cli,建议大家可以基于这个来快速开发ng2的项目,不用自己再搭建环境: 相关内容请前往:https://angular.cn/docs/ts ...

  9. 自定义 Layout布局 UICollectionViewLayout

    from:   http://www.tuicool.com/articles/vuyIriN 当我们使用系统自带的UICollectionViewFlowLayout无法实现我们的布局时,我们就可以 ...

  10. 一道面试题引发的pythonic

    一道测试工程师面试题(来自搜狗): 自己写了解法: # -*- coding: utf-8 -*- import re #从整体log中过滤出有用的部分,缩小搜索范围 def filter_log(t ...