超顺滑!优化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);}}
动画部分的变量说明下次补充。
- 超顺滑!优化android ListView拖拽移位
- android ListView和GridView拖拽移位实现代码
- android ListView和GridView拖拽移位实现代码
- android ListView和GridView拖拽移位实现代码
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- android ListView和GridView拖拽移位具体实现及拓展
- 【android 优化】listview优化原理
- micro2440/tiny6410使用JLINK直接烧录nand flash
- rzsz的安装
- Android NDK开发的环境配置和使用
- extjs中的事件注册和调用顺序
- 小巧的编辑器Gnu nano-------入门篇
- 超顺滑!优化android ListView拖拽移位
- HP Unix 11.11 安装jdk15:
- hdu4463-Outlets
- MPEG-2视频编码方式
- cocos2d-x cocosBuilder
- ios 正则表达式 去标点 只含数字 字母 汉字 空格
- Linux上配置sendmail
- android优化
- SecureCRT 快捷键