下拉关闭效果,大致如上图(网上随便找的)
序言:
如果你只是简单实现这种效果,Android原生就已经有一个很不错的控件:BottomSheetDialog ,相信你可以通过这个名字轻松搜索出它的用法,用法非常简单。
如果你有特殊需求,不能使用dialog,单靠一个RecycleView实现这种下拉关闭的效果,那你可以试试我这种方式。
思路:
我们首先要知道,这个RecyclerView滑动是不是已经在最顶部,其次判断出用户向下滑动的手势。两个条件同时满足时,就关闭(隐藏)该RecyclerView。
实现:
/**
* 最顶部继续向下滑动时,会触发回调的RecyclerView
* Created by Fushize on 2018/12/27.
*/
public class MyRecyclerView extends RecyclerView {
private float mPosY; //手指按下时Y轴的值
private float mCurPosY; //手指移动时Y轴的值
private boolean isTop = true;//判断是否到达顶部
private boolean isStop = false; //第一次进入RecyclerView时默认就是顶部,所以需要进行判断
private CloseView callBack;
//滑动到顶部时如果继续下滑则回调此方法
public interface CloseView {
void colseCallBack();
}
public void setCloseViewListener(CloseView callBack){
this.callBack = callBack;
}
public MyRecyclerView(Context context) {
super(context);
}
public MyRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPosY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurPosY = event.getY();
break;
case MotionEvent.ACTION_UP:
if (mCurPosY - mPosY > 0 && (Math.abs(mCurPosY - mPosY) > 10)) {
//向下滑動
if (isTop) {
callBack.colseCallBack();
}
}
break;
}
return super.onTouchEvent(event);
}
@Override
public void onScrolled(int dx, int dy) {
super.onScrolled(dx, dy);
if (isStop) {
if (canScrollVertically(-1)) {
isTop = false;
} else {
//滑动到顶部
isTop = true;
}
}
isStop = true;
}
}
使用:
1.用MyRecyclerView在布局中替换原本的RecyclerView。
2.实现下拉会触发的回调方法:
mRecyclerView.setCloseViewListener(new MyRecyclerView.CloseView() {
@Override
public void colseCallBack() {
//下拉回调
}
});
3.你可以在这个回调里做你的事情,它就像OnClick。
4. 如果你需要隐藏显示RecyclerView,最好加个过渡动画,看起来会好看一点。
End.