Android 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,代碼如下: view source print? 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添加觸發的事件: view source print? 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細節篇 看到很多人要求我給源碼,因爲這是商業項目,公司的產品還沒發佈,所以我不好公開源碼,等公司不用這個版本了,我馬上公開源碼,不過大家還是靜心下來自己解決,不懂的可以發評論,我儘快回覆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章