前文
做这个的初衷是为了满足产品的修改要求:在展示介绍图片时候,需要有翻页的效果不能停在半路。。哈哈哈,产品要求说改就改,那原来用的HorizontalScrollView
咋办?
分析
HorizontalScrollView
还能不能用?能用啊,判断每个child
的位置,然后scrollto
是可以满足要求的啊,可是交互不愿意了:你这切换的太快了啊!好好好,我改行么。
难不成放弃HorizontalScrollView
?不,我不会的。scrollto
的时间又不能改,人家写死250
了。
于是我想到了属性动画ObjectAnimator
。
总结下就是:不想放弃HorizontalScrollView,反射又不想用,只能用属性动画才能维持得了代码这样子。
代码实现分析
大体思路:首先,继承HorizontalScrollView
。然后重写dispatchTouchEvent
,再然后重写fling
。
具体思路:dispatchTouchEvent
里判断手势滑动了多少,如果超过阈值,那就换页。反之,则恢复原位。
fling
时判断方向,默认为直接翻页操作。
是的,就这么简洁。 不过写的时候要注意很多。
直接上代码!
|
|
代码中 slidGap = getScreenWidth(getContext()) / 3;
是滑动阈值,超过时候会翻页,这里写死了屏幕宽度的三分之一。
caculateChild(ViewGroup viewGroup)
方法是计算每个child
的最左边,记录下来,之后翻页的时候直接滚动。
比较核心的代码就是下面这些哈:
|
|
主要就是在UP事件发生时,判断滑动距离,看是否是切到下一页,还是上一页,还是滑回原样。
ObjectAnimator.ofInt(this, "scrollX", map.get(++nowChild)).setDuration(duration).start();
ObjectAnimator
动画一句话搞定
基本实现需求,不多说了~看看效果吧(gif录得不好。。):