第一步自己创建自动轮播视图:

  1 public class AutoShowView extends FrameLayout {
  2     private View view;
  3     private ViewPager vp_lunbo;
  4     private TextView tv_desc;
  5     private LinearLayout ll_points;
  6     private List<ImageView> datas;
  7     private PicturePagerAdapter adapter;
  8     private Handler handler;
  9
 10     final AutoScrollTask autoScrollTask = new AutoScrollTask();
 11     protected int selectIndex;
 12
 13     public AutoShowView(Context context) {
 14
 15         this(context, null);
 16     }
 17
 18     public AutoShowView(Context context, AttributeSet attrs) {
 19         this(context, attrs, 0);
 20     }
 21
 22     public AutoShowView(Context context, AttributeSet attrs, int defStyleAttr) {
 23         super(context, attrs, defStyleAttr);
 24         initView(context);
 25         initData();
 26         initListener();
 27     }
 28
 29     private void initView(Context context) {
 30         view = LayoutInflater.from(context).inflate(R.layout.view_autoshow,
 31                 this);
 32
 33         vp_lunbo = (ViewPager) view.findViewById(R.id.vp_lunbo);
 34         tv_desc = (TextView) view.findViewById(R.id.tv_desc);
 35         ll_points = (LinearLayout) view.findViewById(R.id.ll_points);
 36
 37         datas = new ArrayList<ImageView>();
 38         adapter = new PicturePagerAdapter(datas);
 39         if (handler == null) {
 40             handler = new Handler();
 41         }
 42     }
 43
 44     private void initData() {
 45         // 初始化图片数据
 46         initImageView();
 47         // 初始化点数据
 48         initPoints();
 49
 50         vp_lunbo.setAdapter(adapter);
 51         // 设置ViewPager当前选中的位置,会调用instantiateItem,最终会选中item0
 52         // 原理:一个数减去其余数后肯定能被除数整除
 53         vp_lunbo.setCurrentItem(10000 - 10000 % datas.size());
 54
 55         autoScrollTask.start();
 56     }
 57
 58     private void initImageView() {
 59         for (int i = R.drawable.icon1; i < R.drawable.icon1 + 4; i++) {
 60             // 创建ImageView容器
 61             ImageView imageView = new ImageView(getContext());
 62
 63             // 设置图片
 64             imageView.setImageResource(i);
 65             imageView.setScaleType(ImageView.ScaleType.FIT_XY);// 图片填充容器
 66             datas.add(imageView);// 添加到集合中
 67         }
 68     }
 69
 70     private void initPoints() {
 71         // 因为每次页面改变都会调用该方法,所以进入该方法时先清空集合。
 72         ll_points.removeAllViews();
 73
 74         for (int i = 0; i < datas.size(); i++) {
 75             View view = new View(getContext());
 76             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
 77                     10, 10);
 78             if (i == selectIndex) {
 79                 tv_desc.setText("图片" + i + "的描述");
 80                 view.setBackgroundResource(R.drawable.point_red);
 81             } else {
 82                 view.setBackgroundResource(R.drawable.point_white);
 83             }
 84             params.leftMargin = 10;
 85             view.setLayoutParams(params);// 设置布局参数
 86             ll_points.addView(view);// 添加到点的容器中
 87         }
 88     }
 89
 90     private void initListener() {
 91         // viewpager注册页面改变监听器
 92         vp_lunbo.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 93             @Override
 94             public void onPageSelected(int position) {
 95                 // 页面选中调用
 96                 selectIndex = position % datas.size();
 97                 initPoints();// 红点跟着页面改变而移动
 98             }
 99
100             @Override
101             public void onPageScrolled(int position, float positionOffset,
102                                        int positionOffsetPixels) { // 页面滑动就调用
103             }
104
105             @Override
106             public void onPageScrollStateChanged(int state) {
107                 // 页面状态改变调用
108
109             }
110         });
111
112         // viewpager 注册触摸事件监听器,实现自动轮播
113         vp_lunbo.setOnTouchListener(new OnTouchListener() {
114
115             @Override
116             public boolean onTouch(View v, MotionEvent event) {
117                 switch (event.getAction()) {
118                     case MotionEvent.ACTION_DOWN:// 按下停止轮播
119                         autoScrollTask.stop();
120                         break;
121                     case MotionEvent.ACTION_MOVE:
122
123                         break;
124                     case MotionEvent.ACTION_UP:// 松开,取消 开始轮播
125                     case MotionEvent.ACTION_CANCEL:
126                         autoScrollTask.start();
127                         break;
128
129                     default:
130                         break;
131                 }
132                 return false;// 不会影响其他view的事件分发
133             }
134         });
135     }
136
137     /** 实现轮播图自动轮播 */
138
139     class AutoScrollTask implements Runnable {
140
141         @Override
142         public void run() {
143             int currentItem = vp_lunbo.getCurrentItem();
144             currentItem++;
145             vp_lunbo.setCurrentItem(currentItem);
146             start();
147         }
148
149         /**
150          * 开始轮播
151          */
152         public void start() {
153             handler.postDelayed(this, 2000);
154         }
155
156         /**
157          * 停止轮播
158          */
159         public void stop() {
160             handler.removeCallbacks(this);
161         }
162     }
163
164 }

第二步写自动轮播的适配器:

 1 public class PicturePagerAdapter extends PagerAdapter {
 2     private static final String tag = "PicturePagerAdapter";
 3     List<ImageView> list;
 4
 5     public PicturePagerAdapter(List<ImageView> imageViews) {
 6         this.list = imageViews;
 7     }
 8
 9     @Override
10     public int getCount() {
11         // 确定要显示的数据量
12         return Integer.MAX_VALUE;// 无限轮播
13     }
14
15     @Override
16     public boolean isViewFromObject(View view, Object object) {
17         // 判断当前要显示的view是否等于标记object,true则显示
18         return view == object;
19     }
20
21     @Override
22     public Object instantiateItem(ViewGroup container, int position) {
23         position = position % list.size();
24         Log.d(tag, "instantiateItem==" + position);
25         // 无限轮播-因为position的值从0~Integer.MAX_VALUE
26         View view = list.get(position);
27         // 添加view到VIewPager中
28         container.addView(view);
29         return view;
30     }
31
32     @Override
33     public void destroyItem(ViewGroup container, int position, Object object) {
34         // 从容器中移除view
35         Log.d(tag, "destroyItem==" + position);
36         container.removeView((View) object);
37     }
38 }

第三步自定义轮播视图布局:

 1 <android.support.v4.view.ViewPager
 2     android:id="@+id/vp_lunbo"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" >
 5 </android.support.v4.view.ViewPager>
 6 <!-- 文字描述和点的容器点和容器 -->
 7
 8 <LinearLayout
 9     android:layout_width="match_parent"
10     android:layout_height="wrap_content"
11     android:layout_alignParentBottom="true"
12     android:background="#22000000"
13     android:gravity="center"
14     android:orientation="vertical"
15     android:paddingBottom="5dp"
16     android:paddingTop="5dp" >
17
18     <TextView
19         android:id="@+id/tv_desc"
20         android:layout_width="wrap_content"
21         android:layout_height="wrap_content"
23         android:textColor="#ffffff" />
24
25     <LinearLayout
26         android:id="@+id/ll_points"
27         android:layout_width="wrap_content"
28         android:layout_height="wrap_content"
29         android:orientation="horizontal" >
30     </LinearLayout>
31 </LinearLayout>

第四步在主页面布局将自动轮播视图插入:

1 <com.example.lenovo.lianxi.view.AutoShowView
2     android:id="@+id/asv"
3     android:layout_width="match_parent"
4     android:layout_height="200dp">
5
6 </com.example.lenovo.lianxi.view.AutoShowView>

第五步自己写跟随轮播的红白点(可自己更改颜色):

 1 <shape xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:shape="oval">
 3
 4     <corners android:radius="5dp" />
 5
 6     <solid android:color="#ff0000" />
 7
 8 </shape>
 9
10
11
12 <shape xmlns:android="http://schemas.android.com/apk/res/android"
13     android:shape="oval">
14
15     <corners android:radius="5dp" />
16
17     <solid android:color="#ffffff" />
18
19 </shape>

最后在放入自动轮播的Activity插入

1 protected static final String tag = "MainActivity";

转载于:https://www.cnblogs.com/98k98k/p/7944145.html

自动轮播本地图片触摸暂停轮播相关推荐

  1. android 3d布局轮播,android 图片/视频混合轮播控件banner

    android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...

  2. 使用vant+video.js实现轮播图图片和视频轮播播放

    先上效果图 1. 安装 npm install video.js 2. 在需要用到的页面引入 import Video from "video.js";import "v ...

  3. Android之ViewPager实现图片无限循环轮播

    很久没有写博客了,之前花时间写了一个Viewpager实现的无限图片轮播,个人感觉还是很好用的QAQ,源码和思路都还算清晰 实现的效果图如下: 这里要补充一下,在这个项目中我把图片轮播写进了一个Vie ...

  4. 原生js实现触摸滚动轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. html图片自动循环轮播图,js实现图片无缝循环轮播

    本文实例为大家分享了js实现图片无缝循环轮播的具体代码,供大家参考,具体内容如下 代码如下 Document #container{ overflow:hidden; width:400px; hei ...

  6. 利用swiper在vue中做轮播图,并改变轮播图的原有箭头、图片等内容

    目标:利用swiper在vue中做轮播图,并改变轮播图的原有箭头.图片等内容. 实现效果:1.点击左右箭头可切换图片. 2.点击后图片出现最左侧样式效果,只有被点击的图片有此效果,不被点击恢复默认效果 ...

  7. css实现的图片列表切换轮播特效html页面前端源码

    大家好,今天给大家介绍一款, css实现的图片列表切换轮播特效html页面前端源码(图1).送给大家哦,获取方式在本文末尾. 图1 特效非常炫酷,可以用于制造音乐播放切换或视频播放切换前端(图2) 图 ...

  8. 利用jQuery实现图片无限循环轮播(不借助于轮播插件)

    原来我主要是用Bootstrap框架或者swiper插件实现轮播图的功能,而这次是用jQuery来实现图片无限循环轮播! 用到的技术有:html.css.JavaScript(少).jQuery(主要 ...

  9. Swiper4.x使用之图片只有一张时不进行轮播,多张才进行轮播

    回想初学JavaScript时,写一个图片的轮播:那是写得惨不忍睹.现在我们再去写图片轮播的话:用Swiper(官网:https://www.swiper.com.cn)分分钟就弄好了. 但是老大又提 ...

最新文章

  1. datagenerator解决训练时候内存不足问题
  2. [慕课笔记] node+mongodb建站攻略
  3. SolidEdge如何自动标注尺寸
  4. fundamental-react在POC中的一个应用
  5. 一个穷人是从什么时候开始有钱的?
  6. phpcms函数:用*号替换(私密信息)中间数据(如手机号、邮箱)
  7. Wolfram 语言之父 Stephen Wolfram :编程的未来
  8. 今天又啃了一些數據類型的東西~漸漸地記起了一些東西。
  9. 本周小结!(二叉树系列之四)
  10. GEOTIF转nc文件
  11. 谷歌桌面_将Google小工具添加到您的桌面
  12. Linux Debian11 Podman容器常用命令
  13. 双硬盘安装Windows+Ubuntu
  14. 《Chrysanthemums Terrace》《菊花台》
  15. 交大计算机技术非全日制,上海交通大学非全日制研究生的区别
  16. 树莓派3 之 USB摄像头安装和使用
  17. 每日三个笑话-20151015
  18. 基于Matlab的二阶电路的动态电路分析!
  19. 电池的安规认证(IEC/EN)和航空运输认证UN38.3
  20. zip打包,unzip解包

热门文章

  1. 【C++】C++中的头文件(.h)—详解(2)
  2. 编译原理 —— 1.1 什么是编译
  3. 卡尔曼滤波估算车辆质量——matab simulink仿真
  4. 无人驾驶汽车系统入门系列
  5. oracle导出客户机使用us7a,导出已复制的文件系统 - Oracle® ZFS Storage Appliance 管理指南,发行版 OS8.6.0...
  6. android init.rc 到底在哪里?
  7. ajax 入参为list_ajax向后台传递list参数
  8. loss 加权_【转载】keras 自定义 loss损失函数, sample在loss上的加权 和 metric
  9. html个人主页_前端性能优化实践 之 百度App个人主页优化
  10. android权限适配 简书,Android动态权限适配