Android 实现图片轮播的三种方法,Android面试回忆录

本文详细介绍了在Android中实现图片轮播的三种方法,包括使用ViewPager、Gallery(已废弃)和Timer。重点讲解了ViewPager的实现细节,如getCount()的设置、instantiateItem()中的position处理和父组件的管理。同时,文中还提供了Handler实现轮播效果的代码示例,以及如何在用户手动滑动时暂停和恢复轮播。最后,作者分享了自己的Android开发经验和面试经历。
摘要由CSDN通过智能技术生成

ViewGroup parent = (ViewGroup)vp;

parent.removeView(view);

}

container.addView(view);

// add listeners here if necessary

return view;

}

}

这里有几个地方需要注意:

getCount() 方法的返回值:这个值直接关系到ViewPager的“边界”,因此当我们把它设置为Integer.MAX_VALUE之后,用户基本就看不到这个边界了。

instantiateItem() 方法position的处理:由于我们设置了count为 Integer.MAX_VALUE,因此这个position的取值范围很大很大,但我们实际要显示的内容肯定没这么多(往往只有几项),所以这里肯定会有求模操作。但是,简单的求模会出现问题:考虑用户向左滑的情形,则position可能会出现负值。所以我们需要对负值再处理一次,使其落在正确的区间内。

instantiateItem() 方法父组件的处理:通常我们会直接addView,但这里如果直接这样写,则会抛出IllegalStateException。假设一共有三个view,则当用户滑到第四个的时候就会触发这个异常,原因是我们试图把一个有父组件的View添加到另一个组件。但是,如果直接写成下面这样:

(ViewGroup)view.getParent().removeView(view);

则又会因为一开始的时候组件并没有父组件而抛出NullPointerException。因此,需要进行一次判断。也就是上面的代码。

destroyItem() 方法:由于我们在instantiateItem()方法中已经处理了remove的逻辑,因此这里并不需要处理。实际上,实验表明这里如果加上了remove的调用,则会出现ViewPager的内容为空的情况。

轮播效果的实现:使用Handler进行更新

这里我定义了一个Handler来处理ViewPager的轮播。所谓的“轮播”效果实现起来是这样的:每隔一定时间(这里是3秒)切换一次显示的页面。通过控制各页面以一定顺序循环播放,就达到了轮播的效果。为此,我们可以使用Handler的sendEmptyMessageDelayed()方法来实现定时更新,并

注意用户也可能会对带有轮播效果的ViewPager手动进行滑动操作,因此我认为用户这时候是希望查看指定页面的,这时候应该取消轮播。下面是这个Handler的实现:

private static class ImageHandler extends Handler{

/**

  • 请求更新显示的View。

*/

protected static final int MSG_UPDATE_IMAGE = 1;

/**

  • 请求暂停轮播。

*/

protected static final int MSG_KEEP_SILENT = 2;

/**

  • 请求恢复轮播。

*/

protected static final int MSG_BREAK_SILENT = 3;

/**

  • 记录最新的页号,当用户手动滑动时需要记录新页号,否则会使轮播的页面出错。

  • 例如当前如果在第一页,本来准备播放的是第二页,而这时候用户滑动到了末页,

  • 则应该播放的是第一页,如果继续按照原来的第二页播放,则逻辑上有问题。

*/

protected static final int MSG_PAGE_CHANGED = 4;

//轮播间隔时间

protected static final

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值