这部分内容可以结合上一部分滑动删除的部分,做一个更好的滑动删除效果。
功能:在listview上,左右滑动,对应的item有左右滑动效果
主要实现思路:
检测listview的touch操作,down时,记录位置,move时,做item滑动,up时,回滚到原始位置。
实现代码:
</pre><pre name="code" class="java">mListView.setOnTouchListener(new OnTouchListener() {
private int mDownX = 0;
private int mDownY = 0;
// 滑动效果
private int mLastMoveX = 0;
@Override
public 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是-1
int 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是-1
int 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;
}
});
效果: