listview左右滑动item效果

这部分内容可以结合上一部分滑动删除的部分,做一个更好的滑动删除效果。


功能:在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;
			}
		});

 
 



效果:

listview左右滑动item效果_第1张图片


你可能感兴趣的:(listview左右滑动item效果)