文档详情

亲手实现一个刷新控件精要.docx

发布:2017-03-22约1.77万字共17页下载文档
文本预览下载声明
想要亲手实现一个刷新控件 你只需要掌握这些知识 现在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. ????
显示全部
相似文档