1. 程式人生 > 實用技巧 >Android開發 在不使用ItemTouchHelper的情況下實現ItemView的左右滑動

Android開發 在不使用ItemTouchHelper的情況下實現ItemView的左右滑動

前言

  在我的部落格裡有介紹過ItemTouchHelper的使用,也介紹過滑動的實現。但是使用ItemTouchHelper有一個問題,它會攔截到View的2到3次的點選事件。雖然多點幾次後點擊事件會恢復。但是這樣的體驗十分不好。所以,為了規避這個問題。我自行實現了itemView的左右滑動效果。

程式碼

maxWidth是限制滑動的最大距離,需要傳入一個px的值。當然,你可以另外寫一個dp轉px的實現轉換。

    /**
     *
     * @param view 需要左右滑動的ItemView
     * @param maxWidth 最大的滑動寬度
     */
    private
void setLeftOrRightSwiped(View view, int maxWidth) { view.setOnTouchListener(new View.OnTouchListener() { float startX; float offsetX; float leftOffset; float rightOffset; boolean isLeft = false; @Override public
boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX();//獲得滑動起始位置 break; case MotionEvent.ACTION_MOVE: offsetX
= startX - event.getX(); isLeft = offsetX > 0; //如果大於0就是左滑動 if (offsetX != 0) { //防止沒有偏移量滑動 if (isLeft) { leftOffset = Math.min(offsetX, maxWidth);//選擇最小的值,防止超出最大滾動寬度 view.setScrollX((int) leftOffset); } else { if (leftOffset != 0){ //不允許在沒有向左滑動的情況下觸發向右滑動 rightOffset = Math.max(maxWidth - Math.abs(offsetX), 0); view.setScrollX((int) rightOffset); } } return true; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (offsetX != 0) {//如果偏移量不等0,就執行自動滑動完整的功能,補齊滑動到一半的效果 if (isLeft) { leftOffset = leftOffset < maxWidth / 2 ? 0 : maxWidth; //如果左滑動偏移量小與最大滑動寬度的一半就回跳 view.setScrollX((int) leftOffset); } else { rightOffset = rightOffset < maxWidth / 2 ? 0 : maxWidth; if (rightOffset == 0){ //右滑動到底了,將左滑動的值清0 leftOffset = 0; } view.setScrollX((int) rightOffset); } return true;//消費這個事件 } break; default: break; } return false; } }); }

End