栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android4,flutter插件引用第三方库

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android4,flutter插件引用第三方库

Workspace的beginDragShared方法

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

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


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

在源码中,该状态转换有三个入口,均在PagedViewWithDraggableItems中给出,即onInterceptTouchEvent、onTouchEvent与onLongClick。最终都转到AppsCustomizePagedView的b

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

eginDragging方法。但笔者试了多次,发现只有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进行物体的移动。其基本流程如下。

handleMoveEvent进行移动


handleMoveEvent是拖拽的主要方法,当用户触发拖拽后,DragController将通过该方法移动被拖拽物视图,并通知各个释放目的对象相应状态的改变。若进入滑屏区域且允许滑屏,执行相应的滑屏操作。如下图所示。

drop释放被拖拽物到当前位置


改变。若进入滑屏区域且允许滑屏,执行相应的滑屏操作。如下图所示。

[外链图片转存中…(img-KumvFWdp-1637897879843)]

drop释放被拖拽物到当前位置


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号