描述
一个高效的Android刷新库,理论上支持所有的视图,比官方的SwipeRefreshLayout更强大且使用方便.
特性:
- 理论上支持所有的视图,且可根据具体需求高效适配.
- 支持多点触摸.
- 支持嵌套滑动,完整实现了NestedScrollingChild3,NestedScrollingParent3 接口,玩转CoordinatorLayout.
- 直接继承自ViewGroup,拥有卓越的性能,支持类FameLayout的特性(Gravity、Margin).
- 支持自动刷新、自动上拉加载、到底自动加载更多(不推荐,建议使用Adapter实现,可自定义到底判断逻辑回调实现预加载更多).
- 支持越界回弹.
- 支持刷新视图自定样式:STYLE_DEFAULT(默认不改变大小)、STYLE_SCALE(动态改变大小,会在SRL内部测量并布局,所以性能会有损失)、STYLE_PIN(不会改变视图大小,固定在顶部或者底部)、STYLE_FOLLOW_SCALE(先纵向跟随移动并且不改变视图大小,大于视图高度后动态改变视图大小且性能会有损失)、STYLE_FOLLOW_PIN(不会改变视图大小,先纵向跟随移动,大于视图高度后固定)、STYLE_FOLLOW_CENTER(不会改变视图大小,先纵向跟随移动,大于视图高度后让视图保持在移动的距离中心点).
- 支持二级刷新事件(TwoLevelSmoothRefreshLayout),PS:淘宝二楼、京东活动.
- 支持横向刷新(HorizontalSmoothRefreshLayout).
- 支持ListView、GridView、RecyclerView加载更多的同步平滑滚动.
- 支持手势:同步Fling(刷新视图仍可见的情况下,会先回滚隐藏刷新视图,而后向下传递Fling手势).
- 支持作为可拉伸内部视图布局使用(类小米设置页效果).
- 丰富的回调接口和调试信息,可利用现有API实现丰富的效果.
引入
添加如下依赖到你的 build.gradle 文件:
dependencies {
implementation 'me.dkzwm.widget.srl:core:1.7.1.1.androidx'
implementation 'me.dkzwm.widget.srl:ext-util:1.7.1.1.androidx'
implementation 'me.dkzwm.widget.srl:ext-material:1.7.1.1.androidx'
implementation 'me.dkzwm.widget.srl:ext-horizontal:1.7.1.1.androidx'
implementation 'me.dkzwm.widget.srl:ext-classics:1.7.1.1.androidx'
implementation 'me.dkzwm.widget.srl:ext-two-level:1.7.1.1.androidx'
//android support 最终版本
implementation 'me.dkzwm.widget.srl:core:1.6.6.8'
implementation 'me.dkzwm.widget.srl:ext-util:1.6.6.8'
implementation 'me.dkzwm.widget.srl:ext-material:1.6.6.8'
implementation 'me.dkzwm.widget.srl:ext-horizontal:1.6.6.8'
implementation 'me.dkzwm.widget.srl:ext-classics:1.6.6.8'
implementation 'me.dkzwm.widget.srl:ext-two-level:1.6.6.8'
}
预览
使用
在Xml中配置
?xml version="1.0" encoding="utf-8"?<me.dkzwm.widget.srl.smoothrefreshlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"><textview android:layout_width="match_parent" android:layout_height="match_parent"></textview></me.dkzwm.widget.srl.smoothrefreshlayout>
Java代码配置
SmoothRefreshLayout refreshLayout = (SmoothRefreshLayout)findViewById(R.id.smoothRefreshLayout);
refreshLayout.setHeaderView(new ClassicHeader(this));
refreshLayout.setOnRefreshListener(new RefreshingListenerAdapter() {
@Override
public void onRefreshing() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
refreshLayout.refreshComplete();
}
}, 4000);
}
});
自定义刷新视图
接口定义
public interface IRefreshView <t extends="" iindicator=""> {
byte TYPE_HEADER = 0;
byte TYPE_FOOTER = 1;
byte STYLE_DEFAULT = 0;
byte STYLE_SCALE = 1;
byte STYLE_PIN = 2;
byte STYLE_FOLLOW_SCALE = 3;
byte STYLE_FOLLOW_PIN = 4;
byte STYLE_FOLLOW_CENTER = 5;
/**
* 返回是头部视图还是尾部视图;
*/
int getType();
/**
* 一般情况都是View实现本接口,所以返回this;
*/
View getView();
/**
* 获取视图样式,自1.4.8版本后支持6种样式,STYLE_DEFAULT、STYLE_SCALE、STYLE_PIN、STYLE_FOLLOW_SCALE、STYLE_FOLLOW_PIN、STYLE_FOLLOW_CENTER;
*/
int getStyle();
/**
* 获取视图的自定义高度,当视图样式为STYLE_SCALE和STYLE_FOLLOW_SCALE时,必须返回一个确切且大于0的值,使用横向刷新库时,该属性实际应该返回的是视图的宽度;
* 自1.6.1版本开始,如果想要当前视图铺满布局即MATCH_PARENT,那么支持返回ViewGroup.LayoutParams.MATCH_PARENT对应的值即`-1`;
*/
int getCustomHeight();
/**
* 手指离开屏幕;
*/
void onFingerUp(SmoothRefreshLayout layout, T indicator);
/**
* 重置视图;
*/
void onReset(SmoothRefreshLayout layout);
/**
* 重新配置视图,准备刷新;
*/
void onRefreshPrepare(SmoothRefreshLayout layout);
/**
* 开始刷新;
*/
void onRefreshBegin(SmoothRefreshLayout layout, T indicator);
/**
* 刷新完成;
*/
void onRefreshComplete(SmoothRefreshLayout layout,boolean isSuccessful);
/**
* 当头部或者尾部视图发生位置变化;
*/
void onRefreshPositionChanged(SmoothRefreshLayout layout, byte status, T indicator);
/**
* 当头部或者尾部视图仍然处于处理事务中,这时候移动其他刷新视图则会调用该方法;
* 在1.4.6版本新加入;
*/
void onPureScrollPositionChanged(SmoothRefreshLayout layout, byte status, T indicator);
}</t>
添加自定义刷新视图
SmoothRefreshLayout.setDefaultCreator(new IRefreshViewCreator() {
@Override
public IRefreshView <iindicator> createHeader(SmoothRefreshLayout layout) {
ClassicHeader header = new ClassicHeader(layout.getContext());
return header;
}
@Override
public IRefreshView<iindicator> createFooter(SmoothRefreshLayout layout) {
ClassicFooter footer = new ClassicFooter(layout.getContext());
return footer;
}
});</iindicator></iindicator>
ClassicHeader header = new ClassicHeader(mRefreshLayout.getContext());
mRefreshLayout.setHeaderView(header);
ClassicFooter footer = new ClassicFooter(mRefreshLayout.getContext());
mRefreshLayout.setFooterView(footer);
- 请直接写入Xml文件,SmoothRefreshLayout会根据添加的View是否是实现了IRefreshView接口进行判断
实现类QQ下拉阻尼效果
mRefreshLayout.setIndicatorOffsetCalculator(new IIndicator.IOffsetCalculator() {
@Override
public float calculate(@IIndicator.MovingStatus int status, int currentPos, float offset) {
if (status == IIndicator.MOVING_HEADER) {
if (offset < 0) {
//如果希望拖动缩回时类似QQ一样没有阻尼效果,阻尼效果只存在于下拉则可以在此返回offset
//如果希望拖动缩回时类似QQ一样有阻尼效果,那么请注释掉这个判断语句
return offset;
}
return (float) Math.pow(Math.pow(currentPos / 2, 1.28d) + offset, 1 / 1.28d) * 2 - currentPos;
} else if (status == IIndicator.MOVING_FOOTER) {
if (offset > 0) {
//如果希望拖动缩回时类似QQ一样没有阻尼效果,阻尼效果只存在于上拉则可以在此返回offset
//如果希望拖动缩回时类似QQ一样有阻尼效果,那么请注释掉这个判断语句
return offset;
}
return -((float) Math.pow(Math.pow(currentPos / 2, 1.28d) - offset, 1 / 1.28d) * 2 - currentPos);
} else {
if (offset > 0) {
return (float) Math.pow(offset, 1 / 1.28d) * 2;
} else if (offset < 0) {
return -(float) Math.pow(-offset, 1 / 1.28d) * 2;
} else {
return offset;
}
}
}
});
Xml属性
SmoothRefreshLayout 自身配置
名称 |
类型 |
描述 |
sr_content |
reference |
指定内容视图的资源ID |
sr_resistance |
float |
移动刷新视图时候的移动阻尼(默认:1.65f ) |
sr_resistanceOfFooter |
float |
移动Footer视图时候的移动阻尼(默认:1.65f ) |
sr_resistanceOfHeader |
float |
移动Header视图时候的移动阻尼(默认:1.65f ) |
sr_ratioToRefresh |
float |
触发刷新时位置占刷新视图的高度比(默认:1f ) |
sr_ratioOfHeaderToRefresh |
float |
触发刷新时位置占Header视图的高度比(默认:1f ) |
sr_ratioOfFooterToRefresh |
float |
触发加载更多时位置占Footer视图的高度比(默认:1f ) |
sr_ratioToKeep |
float |
刷新中保持视图位置占刷新视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
sr_ratioToKeepHeader |
float |
刷新中保持视图位置占Header视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
sr_ratioToKeepFooter |
float |
刷新中保持视图位置占Footer视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
sr_maxMoveRatio |
float |
最大移动距离占刷新视图的高度比(默认:0f ,表示不会触发) |
sr_maxMoveRatioOfHeader |
float |
最大移动距离占Header视图的高度比(默认:0f ,表示不会触发) |
sr_maxMoveRatioOfFooter |
float |
最大移动距离占Footer视图的高度比(默认:0f ,表示不会触发) |
sr_closeDuration |
integer |
指定收缩刷新视图到起始位置的时长(默认:350 ) |
sr_closeHeaderDuration |
integer |
指定收缩Header视图到起始位置的时长(默认:350 ) |
sr_closeFooterDuration |
integer |
指定收缩Footer视图到起始位置的时长(默认:350 ) |
sr_backToKeepDuration |
integer |
设置回滚到保持刷新视图位置的时间(默认:200 ) |
sr_backToKeepHeaderDuration |
integer |
设置回滚到保持Header视图位置的时间(默认:200 ) |
sr_backToKeepFooterDuration |
integer |
设置回滚到保持Footer视图位置的时间(默认:200 ) |
sr_enablePinContent |
boolean |
固定内容视图(默认:false ) |
sr_enableKeep |
boolean |
刷新中保持视图停留在所设置的应该停留的位置(默认:true ) |
sr_enablePullToRefresh |
boolean |
拉动刷新,下拉或者上拉到触发刷新位置即立即触发刷新(默认:false ) |
sr_enableOverScroll |
boolean |
越界回弹(默认:true ) |
sr_enableRefresh |
boolean |
设置是否启用下拉刷新(默认:ture ) |
sr_enableLoadMore |
boolean |
设置是否启用加载更多(默认:false ) |
sr_mode |
enum |
模式设置(默认:MODE_DEFAULT 为刷新控件模式) |
sr_stickyHeader |
reference |
指定黏贴头部的资源ID |
sr_stickyFooter |
reference |
指定黏贴尾部的资源ID |
TwoLevelSmoothRefreshLayout 自身配置
名称 |
类型 |
描述 |
sr_enableTwoLevelRefresh |
boolean |
设置是否启用二级刷新(默认:true ) |
sr_backToKeep2Duration |
boolean |
设置回滚到保持二级刷新头部处于二级刷新过程中的时长(默认:500 ) |
sr_closeHeader2Duration |
boolean |
设置关闭二级刷新头部的时长(默认:500 ) |
SmoothRefreshLayout包裹内部其他View支持配置
名称 |
类型 |
描述 |
layout_gravity |
flag |
指定其它被包裹视图的对齐属性(非 targetView、非refreshView) |
SmoothRefreshLayout 其它
名称 |
参数 |
描述 |
setDefaultCreator(静态方法) |
IRefreshViewCreator |
设置刷新视图创建者,如果没有特殊指定刷新视图且设置的模式需要刷新视图则会调用创建者构建刷新视图 |
refreshComplete |
无参 |
刷新完成,且设置最后一次刷新状态为成功 |
refreshComplete |
boolean |
刷新完成,参数:设置最后一次刷新是否刷新成功 |
refreshComplete |
boolean,long |
刷新完成,参数1:设置最后一次刷新是否刷新成功,参数2:设置延迟重置刷新状态的时间(会先触发刷新视图的刷新完成回调,但在延迟的时间内库实际上状态仍是刷新状态) |
refreshComplete |
long |
刷新完成,且设置最后一次刷新状态为成功,参数:设置延迟重置刷新状态的时间(会先触发刷新视图的刷新完成回调,但在延迟的时间内库实际上状态仍是刷新状态) |
setLoadingMinTime |
long |
设置开始刷新到结束刷新的最小时间差(默认:500 ),参数:时间差 |
autoRefresh |
无参 |
自动触发Header刷新,立即触发刷新事件并滚动到触发Header刷新位置 |
autoRefresh |
boolean |
自动触发Header刷新,参数:是否立即触发刷新事件,会滚动到触发Header刷新位置 |
autoRefresh |
boolean,boolean |
自动触发Header刷新,参数1:是否立即触发刷新事件,参数2:是否滚动到触发Header刷新位置 |
forceRefresh |
无参 |
强制触发Footer刷新,该方法不会触发滚动 |
autoLoadMore |
无参 |
自动触发Footer刷新,立即触发刷新事件并滚动到触发Footer刷新位置 |
autoLoadMore |
boolean |
自动触发Footer刷新,参数:是否立即触发刷新事件,会滚动到触发Footer刷新位置 |
autoLoadMore |
boolean,boolean |
自动触发Footer刷新,参数1:是否立即触发刷新事件,参数2:是否滚动到触发Footer刷新位置 |
forceLoadMore |
无参 |
强制触发Footer刷新,该方法不会触发滚动 |
TwoLevelSmoothRefreshLayout java属性设置方法
名称 |
参数 |
描述 |
setRatioOfHeaderToHintTwoLevel |
float |
设置触发二级刷新提示时的位置占Header视图的高度比 |
setRatioOfHeaderToTwoLevel |
float |
设置触发二级刷新时的位置占Header视图的高度比 |
setRatioToKeepTwoLevelHeader |
float |
二级刷新中保持视图位置占Header视图的高度比(默认:1f ) |
setDisableTwoLevelRefresh |
boolean |
设置是否关闭二级刷新(默认:false ) |
setDurationOfBackToKeepTwoLevel |
int |
设置回滚到保持二级刷新Header视图位置的时间(默认:500 ) |
setDurationToCloseTwoLevel |
int |
设置二级刷新Header刷新完成回滚到起始位置的时间(默认:500 ) |
TwoLevelSmoothRefreshLayout 其它
名称 |
参数 |
描述 |
autoTwoLevelRefreshHint |
无参 |
自动触发二级刷新提示并滚动到触发提示位置后回滚回起始位置 |
autoTwoLevelRefreshHint |
int |
自动触发二级刷新提示并滚动到触发提示位置后停留指定时长,参数:停留多长时间 |
autoTwoLevelRefreshHint |
boolean |
自动触发二级刷新提示是否滚动到触发提示位置后回滚回起始位置,参数:是否滚到到触发位置 |
autoTwoLevelRefreshHint |
boolean,int |
自动触发二级刷新提示,参数1:是否滚动到触发位置,参数2:停留多长时间 |
autoTwoLevelRefreshHint |
boolean,int,boolean |
自动触发二级刷新提示,参数1:是否滚动到触发位置,参数2:停留多长时间,参数3:是否可以被触摸打断,即触发提示动作过程中拦截触摸事件,直到回滚到起始位置并重置为默认状态 |
Thanks
下载
SmoothRefreshLayout-master.zip
源码下载
开源
项目地址: https://github.com/dkzwm/SmoothRefreshLayout
项目分类: Android
提 交 者 : dkzwm
授权协议 : Apache-2.0
项目无法下载啊,clone 也非常的慢,咋回事啊,不再境内么
测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试