if (getScrollY() == 0) {
isTop = true;
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mTouchDownY = ev.getY();
mCurrentTop = mInitTop = mHeader.getTop();
mCurrentBottom = mInitBottom = mHeader.getBottom();
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mContentView != null) {
doTouchEvent(ev);
}
// 禁止控件本身的滑动.
return mEnableTouch || super.onTouchEvent(ev);
}
/**
-
触摸事件处理
-
@param event
*/
private void doTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
doActionMove(event);
break;
case MotionEvent.ACTION_UP:
// 回滚动画
if (isNeedAnimation()) {
rollBackAnimation();
}
if (getScrollY() == 0) {
mState = State.NORMAL;
}
isMoving = false;
mEnableTouch = false;
break;
default:
break;
}
}
/**
-
执行移动动画
-
@param event
*/
private void doActionMove(MotionEvent event) {
// 当滚动到顶部时,将状态设置为正常,避免先向上拖动再向下拖动到顶端后首次触摸不响应的问题
if (getScrollY() == 0) {
mState = State.NORMAL;
// 滑动经过顶部初始位置时,修正Touch down的坐标为当前Touch点的坐标
if (isTop) {
isTop = false;
mTouchDownY = event.getY();
}
}
float deltaY = event.getY() - mTouchDownY;
// 对于首次Touch操作要判断方位:UP OR DOWN
if (deltaY < 0 && mState == State.NORMAL) {
mState = State.UP;
} else if (deltaY > 0 && mState == State.NORMAL) {
mState = State.DOWN;
}
if (mState == State.UP) {
deltaY = deltaY < 0 ? deltaY : 0;
isMoving = false;
mEnableTouch = false;
} else if (mState == State.DOWN) {
if (getScrollY() <= deltaY) {
mEnableTouch = true