首先来介绍下launcher目录下的几个文件吧,我做简单说明:
AddAdapter:添加桌面元素的适配器。
AllAppsGridView:Icon列表的的主界面,继承gridView。
DeleteZone:luancher的删除区域,继承ImageView。
DragController:拖动控制接口。
DragLayer:整个launcher的父节点,继承FrameLayout,实现接口DrayController。
DragSource:拖动源接口,定义了void onDropCompleted(View target, boolean success)。
DropTarget:拖动目标,定义很多拖动过程需要的方法:onDrop,onDragEnter,onDragOver,onDragExit,acceptDrop。
HandleView:launcher抽屉的开关,不过在android2.2已经没用抽屉了。
Launcher:整个launcher的程序的入口,代码量最大的一个文件。
Workspace:整个界面layout,几个窗口就是他下面的子节点。
我需要改动的就是模仿Mac系统,在桌面的底部加一个icon的列表功能,而且要求是把icon拖入拖出,首先上一张已经做出来的效果图:
![1281671799433.png](http://news.wangmeng.cn/attachments/201008/1281671799433.png)
我首先列出我完成的几个主要源文件:
DockProvider:持久化dock Item的元素。
DockSettings:dock一些元素和uri信息。
DockView:显示icon的布局,继承LinearLayout实现DropTarget,DragSource, DragController.DragListener,OnClickListener, View.OnLongClickListener接口。
我在这里主要说下,实现原理,DockView是主要文件,它继承LinearLayout是为了它里面的元素水平摆放,直接用addView继承实现,继承系统的那些接口都是为了,接收到icon拖动的状态和信息。
首先要在Launcher的setupViews函数里面初始化自己的layout,代码如下:
01.
private
void
setupViews() {
02.
mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
03.
final
DragLayer dragLayer = mDragLayer;
04.
05.
mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
06.
final
Workspace workspace = mWorkspace;
07.
08.
/*mDrawer = (SlidingDrawer) dragLayer.findViewById(R.id.drawer);
09.
final SlidingDrawer drawer = mDrawer;*/
10.
11.
mAllAppsGrid = (AllAppsGridView) dragLayer.findViewById(R.id.content);
12.
dock_view=(DockView)dragLayer.findViewById(R.id.dock_view);
13.
14.
dock_view.setLauncher(
this
);
15.
dock_view.setDragger(mDragLayer);
16.
dock_view.init();
17.
18.
//mAllAppsGrid.setVisibility(View.GONE);
19.
final
AllAppsGridView grid = mAllAppsGrid;
20.
21.
final
DeleteZone deleteZone = (DeleteZone) dragLayer.findViewById(R.id.delete_zone);
22.
23.
mHandleView = (HandleView) dragLayer.findViewById(R.id.all_apps);
24.
mHandleView.setLauncher(
this
);
25.
//mHandleIcon = (TransitionDrawable) mHandleView.getDrawable();
26.
//mHandleIcon.setCrossFadeEnabled(true);
27.
28.
//author:jezz
29.
main_apps=(RelativeLayout)dragLayer.findViewById(R.id.main_apps);
30.
home=(ImageView)dragLayer.findViewById(R.id.all_home);
31.
32.
main_apps.setVisibility(View.GONE);
33.
mHandleView.setOnClickListener(
new
OnClickListener() {
34.
public
void
onClick(View v) {
35.
onMainOpened(
true
);
36.
37.
}
38.
});
39.
home.setOnClickListener(
new
OnClickListener() {
40.
public
void
onClick(View v) {
41.
onMainClosed(
true
);
42.
}
43.
});
44.
45.
/*drawer.lock();
46.
final DrawerManager drawerManager = new DrawerManager();
47.
drawer.setOnDrawerOpenListener(drawerManager);
48.
drawer.setOnDrawerCloseListener(drawerManager);
49.
drawer.setOnDrawerScrollListener(drawerManager);*/
50.
51.
grid.setTextFilterEnabled(
false
);
52.
grid.setDragger(dragLayer);
53.
grid.setLauncher(
this
);
54.
55.
workspace.setOnLongClickListener(
this
);
56.
workspace.setDragger(dragLayer);
57.
workspace.setLauncher(
this
);
58.
59.
deleteZone.setLauncher(
this
);
60.
deleteZone.setDragController(dragLayer);
61.
deleteZone.setHandle(mHandleView);
62.
63.
dragLayer.setIgnoredDropTarget(grid);
64.
dragLayer.setDragScoller(workspace);
65.
dragLayer.setDragListener(deleteZone);
66.
67.
dragLayer.setDockDragListener(dock_view);
68.
69.
dock_view.setWorkspace(workspace);
70.
}
DragLayer添加触发的事件:
1.
if
(mListener !=
null
) {
2.
mListener.onDragStart(v, source, dragInfo, dragAction);
3.
}
4.
if
(mDockListener!=
null
){
5.
mDockListener.onDragStart(v, source, dragInfo, dragAction);
6.
}
以上两个细节地址,还有很多细节都要改,如你的dock区域是不让用户拖入的,所以在底部区别你要创建一个Rect,让这个Rect区域为禁用,再就是有个细节的地方注意:当用户卸载程序的时候你的icon也要跟着一起删除,不过他已经写好了,ApplicationsIntentReceiver,你在其中加下你的删除逻辑就可以了。
Launcher之Dock细节篇
看到很多人要求我给源码,因为这是商业项目,公司的产品还没发布,所以我不好公开源码,等公司不用这个版本了,我马上公开源码,不过大家还是静心下来自己解决,不懂的可以发评论,我尽快回复。