您的位置:首页 > 其它

实现GridView长按拖动图标,其余图标自动移位的效果(仿webos的note风格)

2012-08-03 14:23 288 查看
点击打开链接

参考文章 :高仿小米launcher(ZAKER)跨屏拖动item

上述文章是在放在item后,2个位置做一个交换,本文在此基础上,实现了拖动过程中,其它item自动移位的效果。其实就是修改了一下OnMove动作中的执行动画过程以及数据刷新的逻辑,主要还是得益于上述文章。

完整源码下载

主要修改的代码如下:

在onTouchEvent接口的move事件中处理 各个item的移动。代码如下:

@Override
public boolean onTouchEvent(MotionEvent ev) {
if (dragImageView != null
&& dragPosition != AdapterView.INVALID_POSITION) {
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
if(!isCountXY) {
xtox = x-mLastX;
ytoy = y-mLastY;
isCountXY= true;
}
onDrag(x, y);
if(!isMoving )
OnMove(x,y);
break;
case MotionEvent.ACTION_UP:
stopDrag();
onDrop(x, y);
break;
}
}
return super.onTouchEvent(ev);
}


其中主要的就是onMove(x,y)函数:

public  void OnMove(int x, int y){
int TempPosition = pointToPosition(x,y);
int sOffsetY = specialItemY == -1 ? y - mLastY : y - specialItemY - halfItemWidth;
int lOffsetY = leftBtmItemY == -1 ? y - mLastY : y - leftBtmItemY - halfItemWidth;
if(TempPosition != AdapterView.INVALID_POSITION && TempPosition != dragPosition){
dropPosition = TempPosition;
}else if(specialPosition != -1 && dragPosition == specialPosition && sOffsetY >= halfItemWidth){
dropPosition = (itemTotalCount - 1);
}else if(leftBottomPosition != -1 && dragPosition == leftBottomPosition && lOffsetY >= halfItemWidth){
dropPosition = (itemTotalCount - 1);
}
if(dragPosition != startPosition)
dragPosition = startPosition;
int MoveNum = dropPosition - dragPosition;
if(dragPosition != startPosition && dragPosition == dropPosition)
MoveNum = 0;
if(MoveNum != 0){
int itemMoveNum = Math.abs(MoveNum);
float Xoffset,Yoffset;
for (int i = 0;i < itemMoveNum;i++){
if(MoveNum > 0){
holdPosition = dragPosition + 1;
Xoffset = (dragPosition/nColumns == holdPosition/nColumns) ? (-1) : (nColumns -1);
Yoffset = (dragPosition/nColumns == holdPosition/nColumns) ? 0 : (-1);
}else{
holdPosition = dragPosition - 1;
Xoffset = (dragPosition/nColumns == holdPosition/nColumns) ? 1 : (-(nColumns-1));
Yoffset = (dragPosition/nColumns == holdPosition/nColumns) ? 0 : 1;
}
ViewGroup moveView = (ViewGroup)getChildAt(holdPosition);
Animation animation = getMoveAnimation(Xoffset,Yoffset);
moveView.startAnimation(animation);
dragPosition = holdPosition;
if(dragPosition == dropPosition)
LastAnimationID = animation.toString();
final DateAdapter adapter = (DateAdapter)this.getAdapter();
animation.setAnimationListener(new Animation.AnimationListener() {

@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
isMoving = true;
}

@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub

}

@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
String animaionID = animation.toString();
if(animaionID.equalsIgnoreCase(LastAnimationID)){
adapter.exchange(startPosition, dropPosition);
startPosition = dropPosition;
isMoving = false;
}
}
});
}
}
}


主要的思路在链接给出的文章中已经比较清晰了,只是将动画的执行放在了Move的动作中去执行,而非Up的动作中。主要工作量就是以上onMove函数,其它可以看链接文章的代码。

PS:Tab没处理,导致代码格式很难看,NND,懒得理它。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: