CycleRotationView:自定义控件之轮播图

xiaoxiao2021-02-28  8

今日科技快讯

“阅后即焚”社交软件Snapchat公司在深圳成立的专注于研发Spectacles智能眼镜的研发中心,于近日发布了一则招聘启事:招募具有三年以上Android/iOS开发经验的工程师,进行核心相机业务的终端研发工作,招募进来的员工将成为Snapchat中国研发团队的第一批骨干员工。在招聘启事中,Snapchat丝毫不避讳“挖墙脚”的说法,指明偏好腾讯T3、百度P5、阿里P6及以上级别的员工。

作者简介

本篇来自 小山 的投稿,分享了打造一个轮播自定义控件的过程,简单明了,希望大家喜欢。

小山 的博客地址:

http://blog.csdn.net/u013132744

正文

CycleRotationView:自定义控件,主要功能是实现类似与各种商城首页的广告轮播图。其实像这种比较常见的自定义控件早就满大街了,虽然说“不要重复发明轮子”,但是不代表不用关心轮子是怎么造的,本着“知其然知其所以然”的态度,完成了这个控件(总不能需要用到时才来学习吧)。老规矩,先来个效果图(没有效果图的文章都是耍流氓):

对于轮播图的图片切换,大家立马会想到 ViewPager 这个控件,因为它已经拥有左右滑动的功能,用来实现轮播图效果会简单一些,本篇也是基于 ViewPager 这个控件的实现,将其分成下面四个部分:

图片轮播

指示器

图片指示器联动

定时轮播

下面开始实现(有点啰嗦,勿喷…):

布局文件

先来看看布局文件,最外层的 RelativeLayout 代表整个控件,包含 ViewPager 和一个 LinearLayout;在 LinearLayout 中又包含 TextView 和 LinearLayout。

这里说明一下:第一个 LinearLayout 包含 标题(id=title) 和 指示器(id=pointGroup),第二个 LinearLayout 用来包裹指示器(在代码里完成),给张理解图(这里我并没有设置标题):

代码实现

首先是加载刚才的布局文件,把 ViewPager 和 pointGroup 找出来;

根据用户传递过来的图片的数量进行遍历创建对应数量的 ImageView ,然后给创建的 ImageView 设置图片,再用一个 List 集合把 ImageView 装起来待用。在 Fragement + ViewPager + TabLayout 的场景里 ViewPager 里填充的是 Fragement,而这里的 ViewPager 填充的是 ImageView;

适配器上场了,在 getCount() 方法里返回 Integer.MAX_VALUE 是因为 ViewPager 不会循环滑动,给这么一个数值(据说 Integer.MAX_VALUE 的值是 10亿,我没试过)可以让它一直滑下去。问题来了:这么大的数值,会不会出现性能问题?这个我也好奇,看谁更有兴趣咯。

还要说一下 instantiateItem() 方法,为什么要判断 parent 的状态?原因是如果不这样处理,在向左滑动 ViewPager 的时候会报错: The specified child already has a parent. You must call removeView 。

注意:instantiateItem() 进行了判断,destroyItem() 就不用再 removeView() 了,否则会出现空白页。

指示器

创建指示器的时候为了和 ImageView 的数量对应,所以同样要遍历用户设置的图片数量。下面是指示器的相关布局文件:

shape_point_selector:

shape_point_selected:

shape_point_normal:

ViewPager 和 pointGroup 都创建好了,接下来是他们俩的联动:

联动

给 ViewPager 添加监听事件,在选中某个页面的同时设置相应位置指示器也被选中。position % mList.size():Adapter 的 getCount() 中返回了很大的值,这里求余可以保证不会出现空指针异常。

定时轮播

定时轮播也很简单,用 Handler 来延时给自己发消息。在 ViewPager 滑动到最后一个时给它设置 mViewPager.setCurrentItem(1) 来实现循环轮播。

基本的轮播功能到这里就完成了,但是还有很多的拓展功能,比如点击事件,用户设置图片链接,这些我都已经实现了,这里就不一一介绍了,有兴趣的可以看看源码:

https://github.com/ljuns/AndroidGrowing

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

转载请注明原文地址: https://www.6miu.com/read-1250093.html

最新回复(0)