由于项目需求,要实现类似于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);
}
}
动画部分的变量说明下次补充。