酷炫动画ExpandingPager源码学习

项目Github地址https://github.com/qs-lll/ExpandingPager

#Expanding动画原理
如作者所说,展开动画原理比较简单,借原作者图片解释下:

作者将两个CardView重叠放置,动画开始时frontFragment向上移动一定距离(Y变小),backFragment的X轴和Y轴同一比例放大。动画由ObjectAnimator类实现。


接着作者为每个fragment的rootView添加了onTouch监听事件,实现手势下滑时收缩动画。作者直接使用
objectAnimator.revers()反转动画达到收缩效果,如下

不过原作者的动画有一个缺陷,在viewPager滑动过程,不能随手势慢慢隐藏,而是在滑动开始的时候粗鲁的执行。这里我做了下改动,监听viewPager的滑动事件,实现随手势慢慢收缩效果。

1
2
3
4
5
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
ExpandingFragment expandingFragment = ExpandingPagerFactory.getCurrentFragment(viewPager);
expandingFragment.closeBySlide(position,positionOffset,positionOffsetPixels);
}

参数positionOffset判断滑动的比例,值为中线以左[0.0-0.999]或中线以右[0.99-0.0]
参数position判断fragment是否划过ViewPager中线,position == fragment在viewPager中的索引位置为左,反之为右。正由于positionOffset这个参数,中线以左越靠近中线趋近于0,中线以右越靠近中线趋近于1.0。所以在随手势变化的时候越过中线的一瞬间值会截然相反,这个时候我们就得根据position来做调整。

这样就可以实现随手势伸缩展开了。这时候会有另外一个问题,手势的变化的临界值不固定,原先判断isOpen()就失效了,随手势变化,scale趋近1.2f却不一定为2.f,isOpen中判断view的scale值 == 1.2f会出现漏掉的情况,这里我将判断改为scale > 1.002f,只要没有趋近1.0f都是打开的状态。这样就解决了上面的问题