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

                                                                                                   


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

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


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

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

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


触摸事件处理:

/**
	 * 触摸事件处理
	 */
	@Override
	public 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;
			//向下drag
			if(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++;
			}
			//向上drag
			else{
				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);
		}
	}

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值