背景:
最近在学习android的事件分发和滑动冲突的解决,所以做了一个头部可折叠的RecyclerView(其实Google的官方控件已经实现了类似的效果,而且还挺好看的),由于对这部分的知识了解得很浅,所以遇到了不少困难。不多说,直接上图。
实现的大致想法:
头部的View(下面都称为HeadView)和RecyclerView放在一个FrameLayout中。HeadView在底层,RecyclerView在表层。当满足一定条件时,RecyclerView的父布局将MotionEvent拦截,然后在自己的onTouchEvent()中处理,将RecyclerView移动到指定位置,那么被遮住的HeadView就露出来了。于是,我只需要自定义一个Layout然后把HeadView和RecyclerView按顺序放入即可。
代码实现:
自定义的DragLayout
public class DragLayout extends FrameLayout {
private class ChildCountException extends RuntimeException{
public ChildCountException(String message){
super(message);
}
}
private View
mMovableView = null,//底层的View
mMainView = null;//表层的View
private float mTouchY;
private float mLastY;
private float mOffsetY ;
public DragLayout(Context context) {
super(context);
}
public DragLayout(
Context context,
AttributeSet attrs) {
super(context, attrs);
}
public DragLayout(
Context context,
AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if(getChildCount() == 2) {
mMovableView = getChildAt(0);
mMainView = getChildAt(1);
}else{
throw