Workspace 拖拽
来源:互联网 发布:什么是多媒体集成软件 编辑:程序博客网 时间:2024/05/18 22:14
workspace 的事件处里流程
设置workspace 的点击事件 在Launcher里面处理
mWorkspace.setOnLongClickListener(this);
1、launcher 中的长按事件将会回调到workspace
if (!(itemUnderLongClick instanceof Folder || isAllAppsButton)) { // User long pressed on an item mWorkspace.startDrag(longClickCellInfo);}
2、workspace 中的回调方法
-->startDrag(cellInfo, false);-->隐藏要拖拽的 Viewchild.setVisibility(INVISIBLE);-->准备当前CellLayout 数据 layout.prepareChildForDrag(child);-->开始拖拽 beginDragShared(child, this, accessible);
3、beginDragShared
// The outline is used to visualize where the item will land if dropped //创建拖拽阴影mDragOutline = createDragOutline(child, DRAG_BITMAP_PADDING);-->//是否要回到默认屏幕 mLauncher.onDragStarted(child);-->//创建拖拽view Bitmap createDragBitmap(child, padding);-->//当前view 在 draylayer 上的坐标(位置)计算拖拽时的 rect -->//调用DragController 开始拖拽并返回正在拖拽时的view -->//DragView dv = mDragController.startDrag(b, dragLayerX, dragLayerY, source, child.getTag(), DragController.DRAG_ACTION_MOVE, dragVisualizeOffset, dragRect, scale, accessible); 参数: B:位图显示拖动图像。它将re-scaled扩大规模。 DragLayer dragLayerX :DragLayer 上的x位置 DragLayer dragLayerY :DragLayer 上的y位置 source源对象代表拖源自哪里(workpace) dragInfo:与被拖动的对象相关的数据 dragAction:拖动行动:DRAG_ACTION_MOVE或 DRAG_ACTION_COPY dragRegion:坐标内的位图b项被拖动的位置。让拖感觉更精确,例如你可以夹一个透明的边界 访问这个阻力是否应该发生在可访问性模式 dragOffset: initialDragViewScale:-->//对正在拖拽的view 进行设置缩放 dv.setIntrinsicIconScaleFactor (source.getIntrinsicIconScaleFactor());
4、mDragController.startDrag
-->先隐藏输入法,假如输入法正显示 -->//对注册DragListener 监听的进行回调 通知拖拽开始 for (DragListener listener : mListeners) { listener.onDragStart(source, dragInfo, dragAction);} -->创建拖拽对象DropTarget.DragObject(); -->创建拖拽时的View -->显示拖拽view ,并拖拽实现dragView.show(mMotionDownX, mMotionDownY);handleMoveEvent(mMotionDownX, mMotionDownY);
5、handleMoveEvent(mMotionDownX, mMotionDownY);
private void handleMoveEvent(int x, int y) { //移动到传进来时的参数 mDragObject.dragView.move(x, y); // Drop on someone? final int[] coordinates = mCoordinatesTemp; //查找放下目标 DropTarget dropTarget = findDropTarget(x, y, coordinates); mDragObject.x = coordinates[0]; mDragObject.y = coordinates[1]; checkTouchMove(dropTarget); // Check if we are hovering over the scroll areas //检查如果我们滚动区域的上空 mDistanceSinceScroll += Math.hypot(mLastTouch[0] - x, mLastTouch[1] - y); mLastTouch[0] = x; mLastTouch[1] = y; checkScrollState(x, y); }-->findDropTarget();查找当前放下的target及坐标-->checkTouchMove(dropTarget);//检查触摸移动private void checkTouchMove(DropTarget dropTarget) { if (dropTarget != null) { if (mLastDropTarget != dropTarget) {//最后一个DropTarget 不=于当前DropTarget if (mLastDropTarget != null) { mLastDropTarget.onDragExit(mDragObject);//退出当前的 } dropTarget.onDragEnter(mDragObject);//进入当前的 } dropTarget.onDragOver(mDragObject); } else { if (mLastDropTarget != null) { mLastDropTarget.onDragExit(mDragObject); } } mLastDropTarget = dropTarget;}--> //检查是否要移别的前一屏或者后一屏checkScrollState(x, y); @Thunk void checkScrollState(int x, int y) { final int slop = ViewConfiguration.get(mLauncher).getScaledWindowTouchSlop();// 触摸窗体边沿区域判断 final int delay = mDistanceSinceScroll < slop ? RESCROLL_DELAY : SCROLL_DELAY;// final DragLayer dragLayer = mLauncher.getDragLayer(); final int forwardDirection = mIsRtl ? SCROLL_RIGHT : SCROLL_LEFT; final int backwardsDirection = mIsRtl ? SCROLL_LEFT : SCROLL_RIGHT; if (x < mScrollZone) {//边缘判断 if (mScrollState == SCROLL_OUTSIDE_ZONE) { mScrollState = SCROLL_WAITING_IN_ZONE; if (mDragScroller.onEnterScrollArea(x, y, forwardDirection)) {//判断是否 //能发生滚动 dragLayer.onEnterScrollArea(forwardDirection); mScrollRunnable.setDirection(forwardDirection); mHandler.postDelayed(mScrollRunnable, delay); } } } else if (x > mScrollView.getWidth() - mScrollZone) {//边缘判断 if (mScrollState == SCROLL_OUTSIDE_ZONE) { mScrollState = SCROLL_WAITING_IN_ZONE; if (mDragScroller.onEnterScrollArea(x, y, backwardsDirection)) { dragLayer.onEnterScrollArea(backwardsDirection); mScrollRunnable.setDirection(backwardsDirection); mHandler.postDelayed(mScrollRunnable, delay); } } } else { clearScrollRunnable(); } }
6、MotionEvent.ACTION_UP:
PointF isFlingingToDelete(DragSource source)//是否甩动删除dropOnFlingToDeleteTarget(dragLayerX, dragLayerY, vec);drop(dragLayerX, dragLayerY);endDrag();
7、DropTarget
onDrop:就是在放下后做的操作;
onDragEnter:进入之后的操作;
onDragOver:在目标体之上做的操作;
onDragExit:退出之后的操作;
1 0
- Workspace 拖拽
- WorkSpace
- Microsoft workspace
- building workspace
- Xcode Workspace
- Chrome Workspace
- 更改workspace
- launcher workspace
- Workspace简介
- Arcgis:Workspace
- eclipse删除workspace空间&workspace配置
- Eclipse switch workspace 时好多多余workspace
- eclipse删除workspace空间&workspace配置
- eclipse中改变workspace
- appache switch new workspace
- 修改eclipse默认workspace
- Simple Maven Workspace Setup
- 更改Eclipse的Workspace
- MFC 通过主窗口向子窗口的listbox控件里赋值,并获取子窗口中listbox控件里的值
- Free Paperdownload
- android 重新签名认领apk
- 在node.js下浅谈前端下载文件的方法
- 图解Tomcat类加载机制
- Workspace 拖拽
- python随机生成汉字并查看编码方式
- 二叉搜索树的操作
- ubuntu 以root登录 无声音
- 一些好的规则
- Storm集群安装部署步骤【详细版】
- JS时间类扩展
- PAT乙级练习题B1015. 德才论
- 第一次盲打测试