作者: | 来源:互联网 | 2023-09-04 14:23
这部分内容可以结合上一部分滑动删除的部分,做一个更好的滑动删除效果。
功能:在listview上,左右滑动,对应的item有左右滑动效果
主要实现思路:
检测listview的touch操作,down时,记录位置,move时,做item滑动,up时,回滚到原始位置。
实现代码:
mListView.setOnTouchListener(new OnTouchListener() {private int mDownX = 0;private int mDownY = 0;// 滑动效果 private int mLastMoveX = 0;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mDownX = Math.round(event.getX());mDownY = Math.round(event.getY());mLastMoveX = mDownX;break;case MotionEvent.ACTION_MOVE: {int moveX = Math.round(event.getX());// 获取2次点击的item位置 item以外的pos是-1int downPosition = ((ListView)v).pointToPosition(mDownX, mDownY);// 点击在有效item内 才做处理boolean willScroll = (downPosition >= 0);if (willScroll) {// 需要先获取第一个可见的view 因为getChildAt获取view的时候,坐标是从第一个可见view开始的int firstVisiableIndex = ((ListView)v).getFirstVisiblePosition();View viewToScroll = ((ListView)v).getChildAt(downPosition - firstVisiableIndex);// 滑动viewToScroll.scrollBy(mLastMoveX - moveX, 0);mLastMoveX = moveX;}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL: {int upX = Math.round(event.getX());int upY = Math.round(event.getY());// 获取2次点击的item位置 item以外的pos是-1int downPosition = ((ListView)v).pointToPosition(mDownX, mDownY);boolean willScroll = (downPosition >= 0);if (willScroll) {// 回滚int firstVisiableIndex = ((ListView)v).getFirstVisiblePosition();View viewToScroll = ((ListView)v).getChildAt(downPosition - firstVisiableIndex);viewToScroll.scrollBy(mLastMoveX - mDownX, 0);}}break;default:break;}return false;}});
效果: