实现下拉刷新,上拉加载可自定义各种动画
来源:互联网 发布:百度云加速软件 编辑:程序博客网 时间:2024/05/16 00:29
GIT:https://github.com/IRVING18/MyUltimateRefreshView.git
一、使用说明
1、UltimateRefreshView 支持ListView,GridView,ScrollView,WebVIew,RecyclerView(只支持LinearLayoutManager).
2、布局使用:
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
- 实现下拉刷新,上拉加载可自定义各种动画
- 自定义下拉刷新上拉加载动画
- 自定义(下拉刷新、上拉加载)帧动画
- JHRefresh--iOS可快速实现自定义下拉刷新/上拉加载组件
- iOS 利用MJRefresh实现上拉刷新下拉加载(自定义动画)
- iOS 利用MJRefresh实现上拉刷新下拉加载(自定义动画)
- Android 自定义ListView 实现下拉刷新 上拉加载功能
- 自定义ListView实现下拉刷新,上拉加载更多
- 安卓自定义ListView实现上拉加载、下拉刷新
- 自定义ListView 实现上拉刷新 下拉加载数据
- 自定义listview实现上拉加载下拉刷新
- SwipeRefreshLayout+ListView实现下拉刷新自定义上拉加载
- 自定义ListView,实现下拉刷新,上拉加载
- 自定义布局实现listview上拉加载下拉刷新
- 自定义控件实现ListView下拉刷新和上拉加载
- 自定义RecyclerView实现下拉刷新和上拉加载
- 自定义listview布局实现上拉加载,下拉刷新
- 自定义ListView实现下拉刷新上拉加载功能
- iOS Orientation, 想怎么转就怎么转
- cnn text classify
- 深入sizeof的使用详解
- Mysql 自定义函数简单例子
- OpenJudge 2.5-1817&&166 城堡问题(The Castle)
- 实现下拉刷新,上拉加载可自定义各种动画
- 机器学习笔记最大熵之NER
- 分离ts媒体文件中每个pid的数据
- [IMX6Q][Android5.1]移植笔记 --- uboot_v2015.04移植
- Spring ajax list转String 传值
- BloomFilter布隆过滤器使用
- 将文件中的内容转化为数组
- caffe中关于layer定义的笔记
- Java网络编程详解