Android4.0 Launcher拖拽原理分析(一)

Launcher2分析——桌面(WorkSpace)图标拖拽 相关博客:Launcher2分析-Launcher,DragController,DragLayer,Workspace,HotSeat,CellLayout,之间的关系长按图标触发进入拖拽模式:在Launcher#setupViews()为WorkSpace绑定了onLongClickListener。所以从Launcher#onLongClick()开始:Launcher#onLongClic... 阅读详情

在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的。

基本流程是相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象、当前位置、拖拽源、待拖拽对象等信息传给DragController的startDrag方法启动拖拽。接下来,DragLayer的onInterceptTouchEvent拦截触屏事件,将其转到DragController的onTouchEvent方法。在DragController的onTouchEvent中调用DragController的handleMoveEvent进行对象的移动,并通知相应拖拽目的对象状态的改变。最后在DragController的onTouchEvent中检测到抬起事件时调用drop方法释放待拖拽对象,调用endDrag方法结束拖拽。

拖拽开始

在Launcher中,拖拽有两种方式触发:1、在Workspace上进行拖拽;2、从AppsCustomizePagedView中选择一个应用或Widget放置到Workspace上。

在Workspace上进行拖拽

长按某个图标或Widget

在这种情况下,会调用Launcher的onLongClick方法,进而对于非文件夹调用Workspace的startDrag方法来隐藏相应视图并绘制图标边界(在Workspace上显示的用于标识当前拖拽图标所处位置的蓝色边界图形),最终转到Workspace.beginDragShared方法。


  

在打开的文件夹中长按某个图标

在Launcher中,对于文件夹中元素的长按,是在Folder的onLongClick里处理的,故长按某个图标或Widget中,对于文件夹,则直接返回。

若允许拖拽,则调用Workspace的beginDragShared进行处理。


 

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进行物体的移动。其基本流程如下。


 

handleMoveEvent进行移动

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


 

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

当用户将被拖拽物移动到相应位置后,可以将手指从屏幕上移开。此时,将在onInterceptTouchEvent(未试出)与onTouchEvent中调用drop方法释放被拖拽物。

其主要功能,就是查找拖拽目的对象(DropTarget),若找到且接受释放,通知该对象被拖拽物的放入。最后,通知拖拽源(被拖拽物最初所在的容器)拖拽结果。


 

findDropTarget查找当前位置对应的拖拽目标对象

在handleMoveEvent与drop中,均使用了findDropTarget来查找当前位置对应的拖拽目的对象,其基本原理就是遍历所有已注册的拖拽目的对象,若其支持放入且当前位置位于该对象的触发区域内,则匹配成功返回该对象。


 

DragController拖拽控制流程总结

总的来说,DragController拖拽控制就是:1、使用startDrag进入拖拽状态;2、使用onInterceptTouchEvent与onTouchEvent响应用户的触屏动作;3、使用handleMoveEvent处理被拖拽物的移动;4、使用drop将被拖拽物释放到相应位置。

android launcher3拖拽事件响应解析长按事件处理 AndroidICS4.0版本的launcher拖拽的流程,基本和2.3的相似。就是比2.3写的封装的接口多了一些,比如删除类的写法就多了个类。等等。4.0的改变有一些,但是不是特别大。这个月一直在改动Launcher的缩略图的效果,4.0的缩略图的功能没有实现,还得从2.3的Launcher中摘出来。通过做这个缩略图对Launcher的模块有一点点了解,拿来分享一下Launcher拖拽的工作流程 阅读详情

相关推荐

【源码剖析】Launcher 8.0 源码 30---用户操作(7)拖拽模式之图标放到桌面上

讲解了各类特殊的操作,不能忘记最常见的操作,把图标放到桌面上。 workspace的droptarget,首先是onDragEnter,从folder或者buttonTargetBar进入workspace。比如先从workspace拖动到buttonTargetBar,然后再回到workspace里。最后回到workspace里面的时候,就会触发workspace的onDragEnter。其中...

dax120的博客 787

android Launcher——拖放功能深入研究

Luancher有一个相对比较复杂的功能就是拖放功能,要深入了解launcher,深入理解拖放功能是有必要的,这篇blog,我将对launcher的拖放功能做深入的了解1.首先直观感受什么时候开始拖放?我们长按桌面一个应用图标或者控件的时候拖放就开始了,包括在all app view中长按应用图标,下面就是我截取的拖放开始的代码调用堆栈 at com.android.launcher2.DragC

stonecao的专栏 2万+

Android 仿Launcher3实现app图标随意拖拽交换位置功能

在最近app的Launcher开发中,要实现仿Launcher3任意拖拽app图标后可以移动,然后和其他app图标交换位置拖动到哪个app图标附近就占用哪个位置,被占用的位置移动到下一个位置的功能开发

安卓兼职framework和app工程师的博客 2356

Launcher拖拽框架

Launcher拖拽框架 桌面应用 icon 的拖拽框架 前置文章 《Launcher的启动过程 》 《 Launcher界面结构 》 前言在手机桌面,我们经常会把一个应用的图标从菜单里面,拉到桌面。或者把一个应用的图标移到自己更加喜欢的位置。这个过程,我们叫它拖拽。拖拽能够让用户方便的把应用放到用户可记得易操作的位置,从而能够让用户快捷的打开高频使用的应用。同时,拖拽也可以让用户能够布置自己的

FamilyYuan的博客 2万+

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4795

反激电源RCD尖峰吸收电路的原理以及调试

反激电源RCD尖峰吸收电路的原理以及调试

mnmmnmn的博客 9249

Android Launcher拖拽原理分析

在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的。 基本流程是相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象、当前位置、拖拽源、待拖拽对象等信息传给DragController的startDrag方法启动拖拽。接下来,DragLayer的onInterceptTouchEvent

Red风信子的博客 2490

代码详解——Transformer

对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。

zyw2002的博客 7209

Android4.0 Launcher拖拽原理分析(1)

 Android4.0 Launcher拖拽原理分析(一) 在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的。 基本流程是相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象、当前位置、拖拽源、待拖拽对象等信息传给DragController的startDrag方法启动拖拽

09的专栏 1095

保姆级教程:用Simulink从零搭建新能源汽车VCU蠕行控制模型(附模型下载)

本文提供了一份详细的Simulink建模教程,指导读者从零开始搭建新能源汽车VCU蠕行控制模型。内容涵盖环境配置、信号定义、蠕行模式使能条件、扭矩控制算法实现及模型验证等关键步骤,特别适合需要将控制算法转化为可执行模型的初学者。教程还包含实用代码示例和常见问题解决方案,帮助开发者快速掌握VCU蠕行控制的Simulink实现技巧。

546

YOLOv8改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 348

Android4.0 Launcher拖拽原理分析

在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的。 基本流程是相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象、当前位置、拖拽源、待拖拽对象等信息传给DragController的startDrag方法启动拖拽。接下来,DragLayer的onInterceptTouchEvent

linghu_java的专栏 869

uniapp - 解决 uni.chooseImage 在苹果 IOS 真机上点击没反应的问题,苹果手机点击 uni.chooseImage方法不生效,也不报任何错误(解决苹果ios系统点击无效问题)

uniapp小程序h5网页苹果ios系统点击uni.chooseImage不执行点击无效,uniapp使用uni.chooseImage方法点击没反应怎么办,uniappuni.chooseImage在ios苹果手机运行点击不触发,uniappuni.chooseImage苹果ios系统点击无效,uniapp项目ios端云打包之后uni.chooseImage不生效了,uniapp打包之后uni.chooseImage()无法打开相机,uniapp苹果手机无法打开相机和相册,uniapp网页h5微信支

🏆 前端领域优质创作者 1万+

Android 4.0 Launcher2源码分析—桌面快捷图标的拖拽

Android 4.0 Launcher2源码分析—桌面快捷图标的拖拽 (2013-06-15 20:07:54) 标签: it   http://blog.csdn.net/chenshaoyang0011/article/details/7854947   本文来自http://blog.csdn.net/chenshaoyang00

memechashang的专栏 881

MATLAB基础应用精讲-【深度强化学习】SAC(Soft Actor-Critic)算法(附MATLAB和python代码实现)

Actor 网络:用于选择动作。Critic 1 和 Critic 2 网络:用于估计 Q 值。Target Critic 1 和 Target Critic 2:与 Critic 网络架构相同,用于生成更稳定的目标 Q 值。,即在保证探索的情况下选择高价值动作。软更新目标 Q 网络参数,使得目标网络参数缓慢向当前网络靠近,避免振荡。

qq_36130719的博客 454

[HBM] RAM Cell Self Repair | 内存单元自我修复

对抗错误的大都是冗余,内存颗粒在设计的时候也考虑增加冗余。具体的说:添加冗余或备用的存储单元行和列,及时将测试中的故障进行修复和替换,存储器修复包括行修复,列修复或两者的组合。

串起点滴 783

Android 4.0 Launcher2源码分析——桌面快捷图标的拖拽

Android交流群1 QQ: 102063643 欢迎大家加入一起学习 本文来自http://blog.csdn.net/chenshaoyang0011 转载请申明文章出处! 通过上一篇文章Android4.0Launcher2源码分析(五)——Workspace的滑动中,已经了解了Launcher的ViewTree中各层所负责的工作,在DragLaye

xu_song的专栏 1067

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Launcher3拖拽分析之Workspace(基于Android 11 )

Launcher3拖拽分析(基于Android 11 ) ==== 先简单分析一下 Workspace#onDragOver()方法 ,后续还有完整的Launcher3源码原理方法解析===== === 分析在Workspace中拖拽item === DragView存在的意义:代替BubbleTextView,在DragLayer上滑动。为什么呢?因为这个BubbleTextView的父布局不是DragLayer,而我们知道子View滑动是不能超过父view的,所以想想,如果直接让BubbleText

C_biubiubiu的博客 2088

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android-->Launcher拖拽事件详解【androidICS4.0--Launcher系列二】

AndroidICS4.0版本的launcher拖拽的流程,基本和2.3的相似。就是比2.3写的封装的接口多了一些,比如删除类的写法就多了个类。等等。4.0的改变有一些,但是不是特别大。这个月一直在改动Launcher的缩略图的效果,4.0的缩略图的功能没有实现,还得从2.3的Launcher中摘出来。通过做这个缩略图对Launcher的模块有一点点了解,拿来分享一下Launcher拖拽的工作流程

lhs286266503的专栏 1631

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【源码剖析】Launcher 8.0 源码 31---用户操作(8)拖拽模式之draglayer和结束语

在完整的讲解了拖拽流程之后,或许还有一个疑问:dragOver是被谁调用的? 点击进入click,然后处理完成,长按进入onlongclick处理完成,这两者都是view的接口。 那么,drag的过程中,需要一直读取手指的位置,这些操作自然也是view的接口View.OnDragListener。Launcher8.0有一个类叫做PinItemDragListener专门用来处理drag相关的...

dax120的博客 558

Android 4.0 Launcher2源码分析——Workspace滑动

本文来自http://blog.csdn.net/chenshaoyang0011 转载请申明文章出处! 文中如有纰漏之处,望不吝指教~~~欢迎讨论,共同学习~~~ Launcher桌面的一大功能就是支持左右滑动,这样的功能在现在的应用中使用非常广泛,并且有很多实现的方式,可以通过使用Fragment来实现也可以通过自定义的控件来实现。 Launcher采用了后者,这一功能的实现在W

JamesChen 1万+
上一篇: DrawCache
下一篇: java中的注解
cding1818
博客等级 码龄17年 963粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值