0
点赞
收藏
分享

微信扫一扫

Android4,腾讯后台开发

云卷云舒xj 2022-01-31 阅读 172

Workspace的beginDragShared方法

从上文中可以发现,只要是在Workspace上启动物体的拖拽,最终都会走到Workspace.beginDragShared方法里。在这个方法中,首先会通过createDragBitmap绘制用于拖拽的图形(包括在原图外层绘制一圈红色边界),然后计算位置与边界,并将其传给DragController管理。

从AppsCustomizePagedView中选择一个应用或Widget放置到Workspace上


AppsCustomizePagedView继承自PagedViewWithDraggableItems,即我们平时所说的应用程序抽屉。当长按应用图标或widget时,AppsCustomizePagedView会隐藏,显示Workspace的缩小状态,即SPRING_LOADED。

在源码中,该状态转换有三个入口,均在PagedViewWithDraggableItems中给出,即onInterceptTouchEvent、onTouchEvent与onLongClick。最终都转到AppsCustomizePagedView的beginDragging方法。但笔者试了多次,发现只有onLongClick被调用。

AppsCustomizePagedView的beginDragging

beginDragging类似一个代理方法,首先进行Launcher状态的转换,然后会根据被拖拽物的不同,调用不同的拖拽方法。

应用程序的拖拽beginDraggingApplication

对于应用程序来说,从抽屉拖拽到桌面,界面的隐藏在beginDragging中都已经处理好了,AppsCustomizePagedView不需要保存任何有关被拖拽应用的信息(就算取消拖拽,也只需要重新显示AppsCustomizePagedView就行了,不像Folder那样还需要恢复快捷方式)。因此,只需要通知Workspace绘制图标边界,然后启动拖拽即可。

Widget/快捷方式的拖拽beginDraggingWidget

对于Widget列表中的元素,由于有可能为快捷方式,因此还需要进行判断。对不同类型的拖拽物,用不同的方式绘制图形及图标边界。

DragController

==============

startDrag开始拖拽


从上文可以发现,无论是以何种方式进入拖拽,最终都是调用DragController的startDrag方法进行处理。

在DragController中,startDrag是个多态方法,但最终,都走到了以下这个实现中。

Java代码   收藏代码

  1. public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,

  2. DragSource source, Object dragInfo, int dragAction,

  3. Point dragOffset, Rect dragRegion)

startDrag的逻辑比较清晰,主要是通知相应的监听器拖拽开始,然后创建拖拽对象及其视图,将其移动到当前触摸到位置。

触屏事件的拦截


onInterceptTouchEvent

DragLayer继承自ViewGroup,其onInterceptTouchEvent方法若返回true,说明需要拦截触屏事件,则后续的一系列事件将传递给自身的onTouchEvent方法,而不再向其子控件传递。

DragController的onInterceptTouchEvent由DragLayer的onInterceptTouchEvent调用,用于拦截触屏事件的处理。当用户点击屏幕时,触发ACTION_DOWN事件,记录当前触摸位置。当抬起时,触发ACTION_UP事件,结束拖拽。若抬起时处于拖拽中,在当前位置释放被拖拽物(在笔者测试过程中未检测到其调用)。最后,返回是否处于拖拽状态。

因此,若此时处于拖拽中,后续的触屏事件将只传递到DragLayer的onTouchEvent。

onTouchEvent

onTouchEvent由于处理触屏事件,若返回true,则表示消费掉该事件,事件不再向父控件的onTouchEvent传递。

DragController的onTouchEvent由DragLayer的onTouchEvent调用,用于处理被拖拽物的移动。

当startDrag执行完毕,DragController设置拖拽状态为true,这样,触屏事件将最终转到onTouchEvent中,在此处调用handleMoveEvent进行物体的移动。其基本流程如下。

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-4AcX60VD-1643523279007)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

举报

相关推荐

0 条评论