亲手实现一个刷新控件精要.docx
文本预览下载声明
想要亲手实现一个刷新控件 你只需要掌握这些知识
现在Android阵营里面的刷新控件很多,稂莠不齐。笔者试图从不一样的角度,在它的个性化和滚动上下一些功夫。笔者期望,这个刷新控件能像Google的SwipeRefreshLayout一样,支持大多数列表控件,有加载更多功能,最好是要很方便的支持个性化,滚动中能够越界是不是也会带来比普通的刷新控件更好的交互体验。
作者:lcodecorex来源:segmentfault|2016-12-13 17:02
?收藏
??分享
现在Android阵营里面的刷新控件很多,稂莠不齐。笔者试图从不一样的角度,在它的个性化和滚动上下一些功夫。笔者期望,这个刷新控件能像Google的SwipeRefreshLayout一样,支持大多数列表控件,有加载更多功能,最好是要很方便的支持个性化,滚动中能够越界是不是也会带来比普通的刷新控件更好的交互体验。开源库在这,TwinklingRefreshLayout,如果喜欢请star,笔者的文章也是围绕着这个控件的实现来说的。
为了方便,笔者将TwinklingRefreshLayout直接继承自FrameLayout而不是ViewGroup,可以省去onMeasure、onLayout等一些麻烦,Header和Footer则是通过LayoutParams来设置View的Gravity属性来做的。
1. View的onAttachedToWindow()方法
首先View没有明显的生命周期,我们又不能再构造函数里面addView()给控件添加头部和底部,因此这个操作比较合适的时机就是在onDraw()之前——onAttachedToWindow()方法中。
此时View被添加到了窗体上,View有了一个用于显示的Surface,将开始绘制。因此其保证了在onDraw()之前调用,但可能在调用 onDraw(Canvas) 之前的任何时刻,包括调用 onMeasure(int, int) 之前或之后。比较适合去执行一些初始化操作。(此外在屏蔽Home键的时候也会回调这个方法)
? onDetachedFromWindow()与onAttachedToWindow()方法相对应。
? ViewGroup先是调用自己的onAttachedToWindow()方法,再调用其每个child的onAttachedToWindow()方法,这样此方法就在整个view树中遍布开了,而visibility并不会对这个方法产生影响。
? onAttachedToWindow方法是在Activity resume的时候被调用的,也就是act对应的window被添加的时候,且每个view只会被调用一次,父view的调用在前,不论view的visibility状态都会被调用,适合做些view特定的初始化操作;
? onDetachedFromWindow方法是在Activity destroy的时候被调用的,也就是act对应的window被删除的时候,且每个view只会被调用一次,父view的调用在后,也不论view的visibility状态都会被调用,适合做最后的清理操作;
就TwinklingRefreshLayout来说,Header和Footer需要及时显示出来,View又没有明显的生命周期,因此在onAttachedToWindow()中进行设置可以保证在onDraw()之前添加了刷新控件。
1. @Override?
2. ????protected?void?onAttachedToWindow()?{?
3. ????????super.onAttachedToWindow();?
4. ?
5. ????????//添加头部?
6. ????????FrameLayout?headViewLayout?=?new?FrameLayout(getContext());?
7. ????????LayoutParams?layoutParams?=?new?LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,?0);?
8. ????????layoutParams.gravity?=?Gravity.TOP;?
9. ????????headViewLayout.setLayoutParams(layoutParams);?
10. ?
11. ????????mHeadLayout?=?headViewLayout;?
12. ????????this.addView(mHeadLayout);//addView(view,-1)添加到-1的位置?
13. ?
14. ????????//添加底部?
15. ????
显示全部