在上一篇博文中,我们实现了仿美团的下拉刷新。而今天的主题还是与 ListView 有关,这次是来实现具有视差效果的 ListView 。
那么到底什么是视差效果呢?一起来看效果图就知道了:
我们可以看到 ListView 的 HeaderView 会跟随 ListView 的滑动而变大,HeaderView里的图片会有缩放效果。这些可以使用属性动画来实现。接下来我们就来动手吧!
首先自定义几个属性,在之后可以用到:
1 | <?xml version="1.0" encoding="utf-8"?> |
之后创建 ZoomListView 类,继承自 ListView :
1 | public class ZoomListView extends ListView { |
到这里都是按部就班式的,设置好自定义属性的初始值,之后调用 initView()
,那就来看看 initView()
方法:
1 | private void initView() { |
可以看出在 initView()
里我们创建了 headerView ,并添加到了ListView的头部。而 setDrawableId(int id)
就是给 headerView 设置相关图片的。
下面就是视差效果的主要实现代码了:
1 | @Override |
我们重写了 overScrollBy()
方法,当 deltaY 小于0时(即 ListView 已经到顶端,但是用户手势还是向下拉),去动态地设置 headerView 的高度以及 headerView 的 scale 值。这样就可以产生 headerView 变高以及图片放大的效果了。
接下来要考虑的问题就是当用户松开手指时,要恢复回原来的样子。所以我们应该在 onTouchEvent(MotionEvent ev)
里去实现相关操作:
1 | @Override |
上面的代码简单点来说,就是在 ACTION_UP 时,去开始两个属性动画,一个属性动画是将 headerView 的高度恢复成原来的值,另一个属性动画就是把 headerView 的 scale 重新恢复为1f。相信大家都可以看懂的。
ZoomListView 整体的代码就这些了,很简短。下面附上下载的链接:
good luck ! ~~