效果图
ScreenGif1.gif
实现流程
新建一个RefreshLayout继承自Linearlayout。
public class RefreshLayout extends LinearLayout
添加一个progressbar到RefreshLayout中,作为第一个View。 public RefreshLayout(Context context) {
super(context);
init();
}
public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public RefreshLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
addHeadRefresh();
}
private void addHeadRefresh() {
setOrientation(LinearLayout.VERTICAL);
ProgressBar progressBar = new ProgressBar(getContext());
addView(progressBar, 0);
}复制代码
通过scroll隐藏progerssbar。@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
scrollTo(0, getChildAt(0).getHeight());
}复制代码
重写onInterfuptTouchEvent()方法,判断下滑时候拦截事件@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
y = (int) ev.getRawY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
interrupt = false;
break;
case MotionEvent.ACTION_MOVE:
if (y - yLast > 2) {
interrupt = true;
} else {
interrupt = false;
}
break;
case MotionEvent.ACTION_UP:
interrupt = false;
break;
}
yLast = y;
return interrupt;
}复制代码
重写onTouchEvent()方法,处理滑动以及弹性滑动@Override
public boolean onTouchEvent(MotionEvent event) {
//动画还没结束的时候,直接消耗掉事件,不处理。
if (!scroller.isFinished()||isRefresh) {
return true;
}
y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
yMove = y - yLast;
if (yMove >= 0) {
scrollBy(0, -yMove / 3); // /3为了让下拉有感觉
i += yMove / 3;
}
break;
case MotionEvent.ACTION_UP:
if(i>=getChildAt(0).getHeight()){
smoothToScroll(i-getChildAt(0).getHeight());
i = getChildAt(0).getHeight();
isRefresh = true;
Toast.makeText(getContext(),"正在刷新中",Toast.LENGTH_SHORT).show();
}else {
endRefresh();
}
break;
}
yLast = y;
return true;
}复制代码
实现弹性滑动典型固定代码 private void smoothToScroll(int destaY) {
scroller.startScroll(0, getScrollY(), 0, destaY, 500);
invalidate();
}
@Override
public void computeScroll() {
super.computeScroll();
if (scroller.computeScrollOffset()) {
scrollTo(0, scroller.getCurrY());
postInvalidate();
}
}复制代码
增加结束滑动方法 public void endRefresh() {
isRefresh = false;
smoothToScroll(i);
i = 0;
}复制代码
第一阶段全部代码如下 public class RefreshLayout extends Li