Android之Launcher的小試心得

Launcher是Android系統的"桌面",在android2.1以前採用的是launcher,android2.2以後採用的launcher2,他們之間最大的區別是launcher2有3D效果,不過launcher2整個系統的代碼的改動仍是比較大的。

首先來介紹下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拖入拖出,首先上一張已經作出來的效果圖:
 

我首先列出我完成的幾個主要源文件:
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細節篇

看到不少人要求我給源碼,由於這是商業項目,公司的產品還沒發佈,因此我很差公開源碼,等公司不用這個版本了,我立刻公開源碼,不過你們仍是靜心下來本身解決,不懂的能夠發評論,我儘快回覆。
相關文章
相關標籤/搜索