超顺滑!优化android ListView拖拽移位

来源:互联网 发布:手机压缩图片软件 编辑:程序博客网 时间:2024/06/07 17:41

                                                                                                   


由于项目需求,要实现类似于ios上的listview的排序。之前在网络上搜索,发现了下面这篇文章,先感谢一下:

http://blog.csdn.net/jj120522/article/details/8240407#comments。


后来看到魅拍上面也有类似的功能,但是性能要快好几倍,同时动画也非常的流畅,于是试着自己优化下。现在性能上基本OK,还有些细节的地方需要优化下,代码也需要整

理下。等整理完了,把代码放上来供大家参考下。

源码地址:https://github.com/wanggang1984117/DragListView                                                                     


触摸事件处理:

/** * 触摸事件处理 */@Overridepublic boolean onTouchEvent(MotionEvent ev) {// item的view不为空,且获取的dragPosition有效if (dragImageView != null && dragPosition != INVALID_POSITION&& !isLock) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_UP:int upY = (int) ev.getY();stopDrag();onDrop(upY);break;case MotionEvent.ACTION_MOVE:int moveY = (int) ev.getY();onDrag(moveY);testAnimation(moveY);break;case MotionEvent.ACTION_DOWN:break;default:break;}return true;// 取消ListView滑动.}return super.onTouchEvent(ev);}

主要的动画部分:

private void testAnimation(int y){final DragListAdapter adapter = (DragListAdapter) getAdapter();int tempPosition = pointToPosition(0, y);if (tempPosition == INVALID_POSITION || tempPosition == lastPosition) {return;}mFirstVisiblePosition = getFirstVisiblePosition();dragPosition = tempPosition;onChangeCopy(lastPosition, dragPosition);int MoveNum = tempPosition - lastPosition;int count = Math.abs(MoveNum);for(int i=1; i<=count; i++){int xAbsOffset, yAbsOffset;//向下dragif(MoveNum > 0){if(lastFlag == -1){lastFlag = 0;isSameDragDirection = true;}if(lastFlag == 1){turnUpPosition = tempPosition;lastFlag = 0;isSameDragDirection = !isSameDragDirection;}if(isSameDragDirection){holdPosition = lastPosition + 1;}else{if(startPosition < tempPosition){holdPosition = lastPosition + 1;isSameDragDirection = !isSameDragDirection;}else{holdPosition = lastPosition;}}xAbsOffset = 0;yAbsOffset = - mItemVerticalSpacing;lastPosition++;}//向上dragelse{if(lastFlag == -1){lastFlag = 1;isSameDragDirection = true;}if(lastFlag == 0){turnDownPosition = tempPosition;lastFlag = 1;isSameDragDirection = !isSameDragDirection;}if(isSameDragDirection){holdPosition = lastPosition -1;}else{if(startPosition > tempPosition){holdPosition = lastPosition -1;isSameDragDirection = !isSameDragDirection;}else{holdPosition = lastPosition;}}xAbsOffset = 0;yAbsOffset = mItemVerticalSpacing;lastPosition--;}adapter.setHeight(mItemVerticalSpacing);adapter.setIsSameDragDirection(isSameDragDirection);adapter.setLastFlag(lastFlag);    ViewGroup moveView = (ViewGroup)getChildAt(holdPosition - getFirstVisiblePosition());        Animation animation;    if(isSameDragDirection){    animation = getFromSelfAnimation(xAbsOffset, yAbsOffset);    }else{    animation = getToSelfAnimation(xAbsOffset, -yAbsOffset);    }    moveView.startAnimation(animation);}}

动画部分的变量说明下次补充。

原创粉丝点击