一起写一个Android图片轮播控件

时间:2021-11-28 00:32:43

注:本文提到的Android轮播控件Demo地址: Android图片轮播控件

1. 轮播控件的组成部分

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

一起写一个Android图片轮播控件

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <LinearLayout
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" >
</LinearLayout> </LinearLayout>

通过对轮播控件的组成部分进行分析,我们已经确定了轮播控件的用户界面,那么接下来,我们要做的就是实现轮播控件的”算法“,也就是业务逻辑。

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,恢复自动播放。

(4) 更进一步

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

一起写一个Android图片轮播控件的更多相关文章

  1. Android图片轮播控件

    Android广告图片轮播控件,支持无限循环和多种主题,可以灵活设置轮播样式.动画.轮播和切换时间.位置.图片加载框架等! 使用步骤 Step 1.依赖banner Gradle dependenci ...

  2. Android 开发最牛的图片轮播控件,基本什么都包含了。

    Android图片轮播控件  源码下载地址: Android 图片轮播 现在的绝大数app都有banner界面,实现循环播放多个广告图片和手动滑动循环等功能.因为ViewPager并不支持循环翻页, ...

  3. Android-----------广告图片轮播控件

    Banner广告图片轮播控件,支持无限循环和多种主题,可以灵活设置轮播样式.动画.轮播和切换时间.位置.图片加载框架等! 很多Android APP中都有广告栏,我也用过很多次了,特来写一篇博文. 先 ...

  4. AndroidImageSlider&lpar;图片轮播控件&rpar;

    1,引入 dependencies { compile "com.android.support:support-v4:+" compile 'com.squareup.picas ...

  5. Android——图片轮播

    Android技术——轮播功能 轮播需要什么? 答:实现图片与广告语展示.循环播发以及手动切换.支持加载本地与网络图片. 性能优化? 答:多张图片与指示器展示.自动与定时.循环播发.滑动流畅并且无卡顿 ...

  6. Swift轮播控件快速入门——FSPagerView

    2018年03月01日 19:17:42 https://blog.csdn.net/sinat_21886795/article/details/79416068 今天介绍一个IOS的轮播控件FSP ...

  7. Android之仿京东淘宝的自动无限轮播控件

    在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于Re ...

  8. Android高仿京东淘宝自动无限循环轮播控件的实现思路和过程

    在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的实现思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于 ...

  9. Qt编写自定义控件24-图片轮播控件

    一.前言 上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成, ...

随机推荐

  1. &lbrack;AlwaysOn Availability Groups&rsqb;AlwaysOn健康诊断日志

    AlwaysOn健康诊断日志 为了监控primary可用副本的健康状况,SQL Server资源DLL使用SQL Server2012的过程sp_server_diagnostics. SQL Ser ...

  2. C语言获得文件一行

    C语言获得一行的数据还是比较麻烦的,这里讲一下几种曾经用过的方法. 第一种,是最笨的方法,就是一个一个字符的读取,也是最容易想到的方法.具体实现如下:void   read_line(char   l ...

  3. SQL Server join介绍

    介绍Inner Join(可以省略Inner,平常经常inner,就是inner join), Full Out Join,Cross Join,Left Join, Right Join区别. )) ...

  4. 在列表页,按照指定的category取所属的post列表

    在某些指定的页面,例如news,blog等页面,需要列出指定某种类型的文章列表,这种情况下,可以先添加两个category,分别命名news,blog,然后再分别添加几个post,指定每个post所属 ...

  5. tomcat调优的几个方面

    转载自:http://my.oschina.net/u/593721/blog/146710 作者:小报童 和早期版本相比最新的Tomcat提供更好的性能和稳定性.所以一直使用最新的Tomcat版本. ...

  6. iterator迭代器的使用

    部分摘自C++ Primer: 所有的标准库容器类都定义了相应的iterator类型,如vector:vector<int>::iterator iter; 这条语句定义了一个名为iter ...

  7. UVALive4513 Stammering Aliens(哈希法,后缀数组)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12580 [思路] 求出现次数不小于k次的最长可重叠子串和最后的出现 ...

  8. paip&period;提升用户体验---c&plus;&plus; qt 取消gcc编译的警告信息&period;txt

    paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http:// ...

  9. SQL之left join、right join、inner join

    创建表(Create table): CREATE TABLE A ( Id INT PRIMARY KEY, Name VARCHAR(20) NOT NULL); CREATE TABLE B ( ...

  10. &lbrack;转&rsqb;Docker和Rancher的安装与基本使用

    本文转自:https://blog.csdn.net/wangshouhan/article/details/80405672 一.Docker1.CentOS下Docker安装 安装 $ yum - ...