(系列文章点这里)
拖动图标是Launcher的特色,非常形象地解释了如何改变桌面的布局,让小白用户也可以轻松上手,这背后所做的工作也是把复杂的东西简单化,简单到按下-移动-松开。
今天说一说这个按下的过程是如何产生的。这里说的按是长按,长按就要找到他的长按监听器。在Workspace中addInScreen方法最后,给图标设置的监听器是Launcher对象,他实现了onLongClick方法。
onLongClick里面有一大坨东西,因为很多东西都需要处理长按事件。我们直接看函数最后的调用Workspace.startDrag,这里就是拖动的起点,函数名很直观“开始拖动”。
这里做一些准备工作,先把点击的图标设置成不可见,然后放弃焦点,将按下的状态设置成false,设置成false之后,按下时候的白边就消失了。接下来通过createDragOutline生成一个轮廓线,这个轮廓线就是用来指示你图标会被放在哪个位置的,你不断拖动,这个轮廓线的位置也在不断变化。最后进入beginDragShared方法,他其实就干了两个事,生成随手动的Bitmap,把工作交接给DragController.startDrag。
DragController是桌面里面的拖拽控制器,一旦他的startDrag执行完了,就可以接收滑动的触摸消息了。
在上图中,开始调用了拖拽监听器(DragListener之后会讲),然后把mDragging设为true,标识他进入了拖拽过程。mDragObject包含了拖拽时候所需的必要信息,在其他很多地方都有调用。而dragView使随手而动的view,通过上面生成的那个bitmap合成而来,通过show方法显示在某个位置上,你在屏幕上滑动的时候,这个dragView的坐标也在一直变化。handleMoveEvent在最后会被调用,他是用来处理ACTION_MOVE事件的,你可能会问,这个时候还没有开始拖动,怎么会有MOVE事件呢?其实。。。。。我也不知道,哈哈
下一次会说说ACTION_MOVE的处理流程,包括DropTarget,DragSource等概念。
onLongClick()里边有一大坨东西,不对,是每个类中都有一大坨东西。。。
博主我想问问launcher可不可以修改系统设置页面,比如说我想把蓝牙设置给隐藏掉,这样能实现吗
这个应该不行
有个问题想请教一下
请问点击hotseat区域的菜单键(中间的那个键)进入的界面还算是workspace区域吗
那个具体来说是AppsCustomizeTabHost,不算是workspace里面,他只是覆盖在Workspace上面的一层
launcher怎么刷新WorkSpace,我删除了快捷键,数据库中没有了,但桌面上还在