实现下拉刷新,上拉加载可自定义各种动画

来源:互联网 发布:百度云加速软件 编辑:程序博客网 时间:2024/05/16 00:29
GIT:https://github.com/IRVING18/MyUltimateRefreshView.git
一、使用说明
1、UltimateRefreshView 支持ListView,GridView,ScrollView,WebVIew,RecyclerView(只支持LinearLayoutManager).
2、布局使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<com.sak.ultilviewlib.UltimateRefreshView
android:id="@+id/refreshView"
android:layout_width="match_parent"
android:layout_marginTop="150dp"
android:layout_height="300dp"
android:background="@color/colorAccent"
android:orientation="vertical">

<android.support.v7.widget.RecyclerView
android:background="@color/green"
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</com.sak.ultilviewlib.UltimateRefreshView>
3、可以根据需求来自定义下拉刷新的动画等等,动画的处理均放到Adapter中。
例如:MeiTuanHeaderAdapter,只需要继承BaseHeaderAdapter,就可回调其中的方法来实现对动画的控制。
二、原理读解帮助
在读源码的时候必然会遇到问题,但是不要心急,毕竟已经读过,相信对你也会很简单。
1、
对于这种嵌套形的刷新控件,就是通过两个方法onInterceptTouchEvent,onTouchEvent来对内部控件的事件拦截处理的。onInterceptTouchEvent通过返回值来判断外层控件是否拦截手势事件,return true时就是外层控件拦截并在onTouchEvent中去消费。通过上一个方法判断是否进入外层控件的onTouchEvent方法,进入之后来进行处理。
2、
其实onTouchEvent方法中处理无非就是对于HeadView的topDistance(顶部坐标)的设置,来进行头布局的隐藏和尾布局的隐藏显示等。读到这里肯定会懵逼,为啥尾部局也是设置HeadView的顶坐标呢?下面我们画个图来解释,但是解释之前我们需要对addVIew()方法进行解释。
3、addView()
@param child the child view to add
     @param index the position at which to add the child or -1 to add last
     @param params the layout parameters to set on the child
     */
    public void addView(View child, int index, LayoutParams params)
(1)这个方法是我们在UltimateRefreshView 初始化HeadView和FootView的时候调用的。
addView()方法是通过index来判断将view加到哪里的,
(2)HeadView中addView(mHeaderView, 0, params);意思就是将HeadView加到最顶部,但并不是隐藏,隐藏是通过设置HeadView的Y轴顶坐标实现的。
(3)FoodView中addView(mFooterView, params);其实这个方法就是默认index为-1,就是将底部距加到最底部,而他的隐藏是通过设置内部布局的显示高度实现的,将内部布局(RecyclerView等)设置成march_parent就会将底部局挤下去。
4、画图。
5、Gif帮助理解。(这本身是源程序BUG,已修改了,但是有助于理解)
通过int topDi

stance = FootViewControlUpdateHeadViewMarginTop(deltaY);修改的。
6、解读为啥HeadViewAdapter有两个下拉时方法。(读的时候必然懵逼,因为现在的代码已经不能重现问题了,所以建议不要去读,就记住做缩放相关操作时不要参照deltaY的方法就对了,使用Scale方法,他是基于HeadView的比例来算的)
背景:在MeiTuanHeadAdapter最一开始的时候发现有一个问题,就是不松手来回上下拉的时候图片缩放会变成傻逼,放大的比例远没有缩小的大,LOG了一下发现Scale甚至到了-2.0,于是开始寻找这个问题所在。
1、问题已经清楚了吧,其实呢这个问题很简单,他是因为onTouchEvent方法中下拉刷新的设置时,initHeaderViewToRefresh()方法在给Adapter回调值得时候的出的问题。
2、首先int topDistance = UpdateHeadViewMarginTop(deltaY);执行时用来设置HeadView的顶部Y轴坐标的,而deltaY就是手势相对于Down下的点Y轴方向滑动的距离,如果滑动到Down点的上边就是负数,下边就是负数。因为它是通过当前点到屏幕顶部的距离- Down点距离顶部的距离计算的。
3、topDistance返回的是什么呢,就是当前HeadView的Y轴坐标,当HeadView完全隐藏时,这个值肯定是-mHeadViewHeight。而我们返回给下拉过程的方法pullViewToRefreshScale(),也是通过判断这个的,但是当topDistance(HeadView顶部Y轴坐标)大于0的时候说明HeadView已经显示出来了,我们就设置成“松手刷新”提示了。
4、那么这个问题出现在哪呢?就是最一开始的对图片的缩放时根据deltaY来作为依据的,问题就在于,他在放大时候不会超过1,而在缩小时会超过-1,因为我们设置顶部可以无限的拉出来,那么这时的topDistance会大于0,而我们这时不松手让他还原回去的话必然要和拉过来的距离一直,而这时deltaY又会回传给Adapter,但是这时的值的绝对值必然要大于topDistance=0的时候的值,这时就出现问题了,也就是topDistance=0时如果传回的值为150,那么这时的值可能是 -200,而我们在adapter中如果参照这个值来做缩放哪必然会有问题。

阅读全文
0 0
原创粉丝点击