实现GridView长按拖动图标,其余图标自动移位的效果(仿webos的note风格)
2012-08-03 14:23
288 查看
点击打开链接
参考文章 :高仿小米launcher(ZAKER)跨屏拖动item
上述文章是在放在item后,2个位置做一个交换,本文在此基础上,实现了拖动过程中,其它item自动移位的效果。其实就是修改了一下OnMove动作中的执行动画过程以及数据刷新的逻辑,主要还是得益于上述文章。
完整源码下载
主要修改的代码如下:
在onTouchEvent接口的move事件中处理 各个item的移动。代码如下:
其中主要的就是onMove(x,y)函数:
主要的思路在链接给出的文章中已经比较清晰了,只是将动画的执行放在了Move的动作中去执行,而非Up的动作中。主要工作量就是以上onMove函数,其它可以看链接文章的代码。
PS:Tab没处理,导致代码格式很难看,NND,懒得理它。
参考文章 :高仿小米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,懒得理它。
相关文章推荐
- 实现GridView长按拖动图标,其余图标自动移位的效果(仿webos的note风格)
- Android GridView 中如何实现item合并,类似于桌面的应用图标效果,长按拖动,加入到另外一个已经存在的文件夹中,或者是压在另一个图标上,行成新的
- Android实现GridView的item长按拖动删除完美实现(带动画效果)
- VC 实现当拖动一个文件到程序的图标上时,程序自动启动并打开该文件
- Android编程实现图标拖动效果的方法
- 纯javaScript实现div层拖动/移位效果 推荐学习
- Android编程实现图片的浏览、缩放、拖动和自动居中效果
- 使用js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
- js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
- 安卓实现高仿IOS桌面效果之可拖动的GridView(上)
- Android实现GridView的item长按拖动删除完美实现(带动画效果)
- Android 实现高仿iOS桌面效果之可拖动的GridView(上)
- GridView拖动效果实现
- 通过改写gridview 实现拖动图标
- Android实现GridView中的item自由拖动效果
- jQuery实现的超酷苹果风格图标滑出菜单效果代码
- [MFC] 无边框窗口的Resize拖动效果的实现(上)
- android Gridview九宫的效果实现
- wpf实现IE菜单栏自动隐藏效果