本文和大家一起写一个Android图片轮播控件,供大家参考,具体内容如下

1. 轮播控件的组成部分

我们以知乎日报Android客户端的轮播控件为例,分析一下轮播控件的主要组成:

首先我们要有用来显示图片的View对象,根据上图中底部中央的5个点,我们知道需要5个ImageView来显示需要轮播的图片,另外还需要5个ImageView来显示5个点。现在考虑以下轮播组件应该具有的行为,首先需要每隔一定时间间隔切换到下一张图片,并且图片间切换的效果应该是平滑的,就像“翻书”一样。由此我们可以想到将5个图片当做ViewPager的Page,这样图片切换时自然会有平滑的效果。接下来,我们还要给底部的5个小点找一个父容器,由于它们是线性排列的,所以用LinearLayout是再合适不过了。然后,我们还要把ViewPager和容纳5个点的LinearLayout放入一个父容器中,这里我们选择使用垂直排列子View的LinearLayout。

这样一来,我们就得到了轮播控件的布局文件(carousel_layout.xml):

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/view_pager"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:id="@+id/dots"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="bottom"

android:gravity="center"

android:orientation="horizontal"

android:padding="8dp" >

通过对轮播控件的组成部分进行分析,我们已经确定了用什么“数据结构”来表示一个轮播组件,那么接下来,我们要做的就是实现轮播组件的”算法“,也就是业务逻辑。

2. 轮播组件的行为分析

轮播控件首先要具有的行为是自动播放,也就是每隔一定事件间隔(通常是3到5秒),便自动”翻到下一页“。为了实现这一点,我们可以维护一个currentItem变量来记录当前正在显示的图片,然后设置一个定时任务,调用ViewPager的setCurrentItem方法设置当前要显示的图片,并将currentItem设为下一张要显示的图片。有一点需要我们注意的便是播放到最后一张图片时,下一个被显示的应该是第一个图片,而且切换的效果也不再是平滑的。

轮播控件的还要能响应我们的滑动动作,也就是我们能够通过左右滑动来在不同的图片之间切换,这个行为ViewPager自动为我们提供了。另外还有一个轮播控件应该具备的行为是:当切换到指定图片时,相应的圆点应该以区别其他4个圆点的颜色显示,以便用户能够知道当前正在播放的是第几个图片。要实现这一点也不复杂,只需要为ViewPager添加一个OnPageChangeListener监听器,然后重写相应的回调方法即可,这样当用户选定了某个Page时,onPageSelected方法会被回调,系统会传入当前Page的索引,我们便可以根据这个索引设置相应的圆点颜色。

3. 轮播控件的具体实现

经过以上的分析,我们已经清楚的了解了轮播组件的表示及业务逻辑,接下来只要我们用Java把这些描述出来就大功告成了。

(1)定时任务

我们需要定时执行“改变ViewPager当前Page为下一个Page”这一任务,这里我们采用Handler来实现,代码如下:

mHandler.postDelayed(task, DELAY);

private final Runnable task = new Runnable() {

@Override

public void run() {

if (isAutoPlay) {

currentItem = (currentItem + 1) % (mTopStories.size());

mVP.setCurrentItem(currentItem);

mHandler.postDelayed(task, DELAY);

} else {

mHandler.postDelayed(task, DELAY);

}

}

};

在以上代码中,DELAY代表我们设置的一个延迟常量(单位ms)。由于我们需要的是循环播放,因此第5张显示完毕后应该显示第一张,所以我们要想第6行那样进行一个模运算,这样currentItem就在0到4之间不停变化了。注意第5行有一个isAutoPlay变量,这个变量表示当前是否应该自动播放。那么什么时候不应该自动播放呢?我们知道当我们滑动手指切换图片时,图片会“跟随”着我们的手,就好比我们翻书页的时候,只有松开了手书页才能落下。所以我们正在“拖动”图片时,也就是我们的手还没松开时,轮播控件是不应该自动播放的。为了实现这一点,我们只需重写OnPageChangeListener中的onPageScrollStateChanged方法,在当前状态为“拖动”时设置isAutoPlay变量为false。从第10行我们可以知道,当autoPlay为false时,不会改变当前显示的图片,仅仅会等过了DELAY指定的时间后再执行下一次定时任务。

(2)OnPageChangeListener

上面我们提到了要给ViewPager添加一个OnPageChangeListener监听器对象,来实现小圆点颜色的改变以及autoPlay变量的赋值。具体的实现请看以下代码,代码的含义都很直接:

class TopOnPageChangeListener implements ViewPager.OnPageChangeListener {

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override

public void onPageSelected(int position) {

for (int i = 0; i < mDotsIV.size(); i++) {

if (i == position) {

mDotsIV.get(i).setImageResource(R.drawable.dot_focus);

} else {

mDotsIV.get(i).setImageResource(R.drawable.dot_blur);

}

}

}

@Override

public void onPageScrollStateChanged(int state) {

switch (state) {

//SCROLL_STATE_DRAGGING

case 1:

isAutoPlay = false;

break;

//SCROLL_STATE_SETTLING

case 2:

isAutoPlay = true;

break;

default:

break;

}

}

}

在以上代码的第10到16行,我们重写了onPageSelected方法,position参数表示当前Page的索引。这个方法中,我们设置当前图片对应的圆点图片为dot_focus,设置其他圆点的图片为dot_blur,这样用户就能知道当前的位置。在第21行到32行,我们重写了onPageScrollStateChanged方法,state参数代表了当前的“滚动状态,这个值为1表示当前用户正在”拖动“的过程中,因此要设置isAutoPlay为false;这个值为2表示用户松开了手,图片正在”滚动“中,这时我们就要把isAutoPlay设回默认值true,恢复自动播放。

(3) 更进一步

有时候我们希望能够从最后一页直接“翻到”第一页,而这种行为默认不被PagerView所支持,要想实现这个行为,我们可以在PagerView中增加一些“辅助页”,并重写OnPageChangeLisener中的相关方法。然而我们在很多场景中只需要保持PagerView的默认行为就好,要注意增加任何功能都要考虑应用场景,避免画蛇添足。

以上就是本文的全部内容,希望对大家的学习有所帮助。

android 图片轮播组件,Android客户端实现图片轮播控件相关推荐

  1. Android 软键盘弹出时把布局顶上去,控件乱套解决方法

    Android 软键盘弹出时把布局顶上去,控件乱套解决方法 参考文章: (1)Android 软键盘弹出时把布局顶上去,控件乱套解决方法 (2)https://www.cnblogs.com/zhuj ...

  2. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...

  3. 如何在 Cell 组件/插件中添加下拉树形控件

    引言 用友华表Cell控件在提供强大的报表功能的同时,在关键细节也是十分突出,为开发者进一步缩短开发周期和最终用 户的完美需求提供了有效有利的平台.下面的例子提供了VB语言对实现美观实用的下拉树形控件 ...

  4. WPF 把图片分割成两份自动翻页 WpfFlipPageControl:CtrlBook 书控件

    原文:WPF 把图片分割成两份自动翻页 WpfFlipPageControl:CtrlBook 书控件 版权声明:本文为博主原创文章,需要转载尽管转载. https://blog.csdn.net/z ...

  5. 基于 next.js + mdx 搭建组件库文档项目(二) -- mdx 控件封装实现组件的演示与 Props 列表

    说明 经过上阶段的配置虽然可以在项目中使用 mdx 语法 来创建页面了,但是我们的组件库有一些定制化的需求:交互式的组件演示.组件 Props 列表展示.这些功能如果可以通过封装来实现,会大大提升开发 ...

  6. android应用程序的组件,Android基础之应用程序组件

    Android应用程序由若干个不同类型的组件组合而成,每一个组件具有其特定的安全保护设计方式,它们的安全直接影响到应用程序的安全.Android应用程序组件的主要类型有:活动(Activity),服务 ...

  7. android 下拉刷新 组件,android系统自带下拉刷新控件的实现

    android系统自带的下拉刷新控件SwipeRefreshLayout位于android.support.v4.widget包下,实现步骤如下: 1.在布局文件中添加该控件,该控件一般作为父控件,而 ...

  8. android组件开关按钮,简单聊聊“开关”这个小控件

    开关虽然只是一个小控件,看起来很简单,但其实它的设计也有着大学问.本文和你一起探讨一下~ 一.开关是什么 开关,英文Switch,常被翻译为开关.滑动开关.切换开关,作为界面中可直接操作的元件,提供两 ...

  9. Android文字广告(Textview上下滚动),使用TextSwitcher控件的完整实现

    实现步骤: a.xml布局 <TextSwitcherandroid:id="@+id/textSwitcher"android:layout_width="mat ...

最新文章

  1. mysql执行计划中性能最差的是_面试中:mysql性能调优-执行计划explain
  2. 甲骨文在中国区裁员是因为云服务在华缺少竞争力吗?
  3. 特斯拉致命车祸最新调查结果发布
  4. 标准博客 API .BLOG APIS
  5. python逐行读取txt写入新的txt_Python逐行读取txt文本,按符合分割词并逐行写入txt...
  6. 为Lucene选择快速唯一标识符(UUID)
  7. Spring/MVC映射WEB-INF下的文件(img、css、js等)
  8. 计算机网络——标准化工作及相关组织
  9. mysql zrm_mysql数据库备份—ZRM
  10. 惠普:计算机在非洲大有可为(zz)
  11. ExecutorService的shutDown和shutDownNow方法的区别
  12. java开源bi_poli-java开源BI软件
  13. Voicemeeter Potato —— Windows 平台下的终极虚拟音频混音器
  14. RT-Thread (3) 为RTT增加SP485驱动||RTT UART设备
  15. 两款很小和强大的mp3分割软件
  16. Unity3D 2D贴图 与 帧动画
  17. AtCoder Beginner Contest 158 E.Divisible Substring
  18. dfuse 开放其 EOSIO 堆栈的源代码
  19. Task2 数据分析 (1)
  20. nginx变量ngx.var

热门文章

  1. 【学习笔记】stm32+openmv串口通信实现颜色识别
  2. layui菜鸟教程--乐字节前端
  3. python爬虫篇,零基础学爬虫之精华版
  4. [zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,经典不忍去的最新近流行的,与你共享~~...
  5. 无线网技术——知识点
  6. du_Welch_cov_burg 功率谱估计 matlab
  7. 付费?不存在的,20 行代码将电子书转换为有声小说
  8. Linux安装phpMywind
  9. phpmywind 教程之多语言版本 面包屑导航之GetPosStr();
  10. 计算机算法可以用自然语言来描述吗,算法可以用自然语言描述吗