大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前言
成都创新互联公司是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,小程序开发,十载建站对三维植被网等多个行业,拥有丰富的网站维护经验。现在很多的 App 都有自动轮播的 banner 界面,用于展示广告图片或者显示当前比较热门的一些活动,除了具备比较酷炫的效果之外,通过轮播的方式来减少对界面的占用,也是很赞的一个设计点。本文主要是总结自动轮播控件的实现过程,以及对这类控件的一些优化的技巧。
一、如何实现
在开始进行我们的代码编程之前,我们先要思考一下,在 Google 提供的官方 Api 里面,有没有类似的控件实现了相似的功能,毕竟官方的控件大都经过了时间的考验,无论是稳定性还是性能方面都是非常不错的,如果我们能够基于官方的控件进行相应的改造,控件的稳定性也会有相对的保障。
在比较常见的主流控件里面,其实 ViewPager 和 RecyclerView 已经实现了类似的功能,尤其是 ViewPager,可以说是已经实现了我们这个控件的大部分功能,所以如果我们基于 ViewPager 来进行改造的话,也能让我们的轮播控件更加稳定。
那 ViewPager 跟我们需要的自动轮播控件有多少差距呢,主要有两个:
所以我们主要是针对这两部分进行相应的改造,从而实现我们自己的自动轮播控件。
1.1 实现自动轮播功能
要想实现自动轮播功能,我们最先想到的应该是通过 Timer 或者 ScheduledExecutorService 来实现计时器的功能,然后让 ViewPager 通过 serCurrentItem(int position) 方法,将当前的 Item 设置为下一个 position 的数据,但是如果通过定时器来实现的话,会有一个问题,那就是我们在需要让 banner 进行停止播放的时候就比较麻烦,所以通过 Handler 用 sendMessage 的形式,进行事件的发送实现 ViewPager 的自动轮播,以及某些场景的停止是比较合理的。
我们来看下代码:
private static class AutoScrollHandler extends Handler { private WeakReferencemBannerRef; private static final int MSG_CHANGE_SELECTION = 1; AutoScrollHandler(AutoScrollViewPager autoScrollViewPager) { mBannerRef = new WeakReference<>(autoScrollViewPager); } private void start() { removeMessages(MSG_CHANGE_SELECTION); sendEmptyMessageDelayed(MSG_CHANGE_SELECTION, AUTO_SCROLL_TIME); } private void stop() { removeMessages(MSG_CHANGE_SELECTION); } @Override public void handleMessage(Message msg) { if (msg.what == MSG_CHANGE_SELECTION) { if (mBannerRef == null || mBannerRef.get() == null) { return; } AutoScrollViewPager banner = mBannerRef.get(); if (banner.mSelectedIndex == Integer.MAX_VALUE) { int rightPos = banner.mSelectedIndex % banner.mBannerList.size(); banner.setCurrentItem(banner.getInitPosition() + rightPos + 1, true); } else { if (!hasMessages(MSG_CHANGE_SELECTION)) { banner.setCurrentItem(banner.mSelectedIndex + 1, true); sendEmptyMessageDelayed(MSG_CHANGE_SELECTION, AUTO_SCROLL_TIME); } } } } }