拖拽在launcher中地位十分重要,因为界面的修改都是通过拖拽来实现的。先看看Android2.3到android4.1代码树的共同部分,接下来翻译Android关于拖拽的介绍,毕竟他们才是最有发言权的。
Android4.1 Launcher源码列表
Android2.3与Android4.1 Launcher同名文件列表
虽然文件数量增加不少,但基本的模型与拖拽相关目录却依旧。
拖放模型介绍
With the Android drag/drop framework, you can allow your users to move data from one View to another View in the current layout using a graphical drag and drop gesture. The framework includes a drag event class, drag listeners, and helper methods and classes.
在Android的拖放框架中,允许用户通过拖放的方式把数据从一个view移动到另一个view中。并且提供了DragEvent、View.OnDragListener、辅助方法与类进行支持。
拖放过程介绍
主要四步走,先看最重要的准备接口,该接口位于View类并定义为:public final boolean startDrag (ClipData data, View.DragShadowBuilder shadowBuilder, Object myLocalState, int flags)
参数:
data ClipData 结构指针,表示剪切的内容。
shadowBuilder View.DragShadowBuilder 结构指针,指向拖放过程中跟随移动的图片。
myLocalState 当前位置状态信息结构体,由自己定义。但他将被系统打包到DragEvent 内部,用于监听器收到拖放数据时根据状态设定进行不同的处理。
flags 预留标志位,当前未使用,需要置零。
返回值:用于表示能否正常启动拖放,因此需要重点关注。
整个拖放过程如果要给他定义一种设计模式,发现行为模式中却木有。于是我给他定义为分房模式,下面就是传说中的分房四部曲:
1.启动:一般通过长按启动拖拽,并于应用中调用startDrag( )方法,即在View的 onLongClick方法中调用。注意startDrag参数的填充,因为这些参数要给拖拽框架与接收者使用。调用startDrag( )(贴告示曰:要分房啦!)后系统响应顺序:
首先显示拖拽图标,即将shadowBuilder指定的图标显示到界面。(放出房子图,并悬停于空中)
接下来给位于当前布局树下的所有View监听器发
ACTION_DRAG_STARTED消息。(所有登记过的都收到了开始分房的通知)
监听器执行相关动作代码,如根据需要高亮当前View或高亮目标View。(有时需要给房子或部分目标群体一些灯光特写)
监听器返回结果,如果为true表示将继续接收,如果为false,那么它将不会再收到拖放信息。(收到通知后你得回复,如果放弃后面就没你什么事了)
2.持续拖动:拖放图标跟随手指移动,并不断监听是否移出当前view区域,或移入其他View区域。同时根据情况决定是否对移入移出状态进行指示。(开发商拿着房子在大家头顶转呀转,经过你的头顶还给你点灯光,但别高兴得太早)
3.放下:用户放下图标,发 ACTION_DROP给当前view。如果用户放下位置无监听,那么系统将不会发送ACTION_DROP事件。当监听器收到ACTION_DROP事件时,表示目的地为自己的区域,于是调用getClipData()取出ClipData数据,并使用或备用。(终于放下了,但有可能放到大家都看不到的地方,如果你收到了房子,那么你别忘了拿走钥匙、房产证等)
4.结束:发 ACTION_DRAG_ENDED给全部监听器。(让大家都回家休息吧,这一轮分XX房结束了)
其他的细节就不再分析了,有了这些内幕已经足够了!