要點:自定義ListView,overwrite方法 dispatchTouchEvent 和 onTouchEvent;使用Scroller工具類;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
addVelocityTracker(ev);
if (!mScroller.isFinished()) {
return super.dispatchTouchEvent(ev);
}
// 起始位置,目前position
mDownX = (int) ev.getX();
mDownY = (int) ev.getY();
int position = pointToPosition(mDownX, mDownY);
if (position == mSlidePosition) break;
mSlidePosition = position;
if (mSlidePosition == INVALID_POSITION ) {
return super.dispatchTouchEvent(ev);
}
// 恢複狀态
clear();
// 擷取目前界面
View childView = getChildAt(mSlidePosition - getFirstVisiblePosition());
mCurrentContentView = (View) childView.findViewById(R.id.view_content).getParent();
mCurrentRemoveView = childView.findViewById(R.id.tv_remove);
break;
case MotionEvent.ACTION_MOVE:
if (mCurrentContentView == null) break;
if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
|| (Math.abs(ev.getX() - mDownX) > mTouchSlop
&& Math.abs(ev.getY() - mDownY) < mTouchSlop)) {
// 開始滑動
mIsSlide = true;
}
break;
case MotionEvent.ACTION_UP:
if (mCurrentContentView == null/* || mIsSlide*/) break;
// 如果左滑小于4/5,按鈕不顯示
if (mDelta < mMaxDistence * 4 / 5) {
//mCurrentRemoveView.setVisibility(View.GONE);
scrollRight();
} else if (mDelta < mMaxDistence) {
scrollLeft();
}
recycleVelocityTracker();
mIsSlide = false;
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mIsSlide && mSlidePosition != INVALID_POSITION) {
final int action = ev.getAction();
int x = (int) ev.getX();
switch (action) {
case MotionEvent.ACTION_MOVE:
addVelocityTracker(ev);
int deltaX = mDownX - x;
mDownX = x;
mDelta += deltaX;
Log.i("onTouchEvent", "mDelta = "+ mDelta);
if (mDelta < 0) {
mCurrentContentView.scrollTo(0, 0);
mDelta = 0;
//mCurrentRemoveView.setVisibility(View.GONE);
} else if (mDelta >= mMaxDistence) {
mDelta = mMaxDistence;
mCurrentContentView.scrollTo(mMaxDistence, 0);
//mCurrentRemoveView.setVisibility(View.VISIBLE);
//mCurrentRemoveView.setTranslationX(0);
} else {
mCurrentContentView.scrollBy(deltaX, 0);
//mCurrentRemoveView.setVisibility(View.VISIBLE);
//mCurrentRemoveView.setTranslationX(mMaxDistence - mDelta);
}
break;
}
return true;
}
return super.onTouchEvent(ev);
}
Demo 源碼位址:
https://download.csdn.net/download/yan072201/10921009
