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细节篇 看到很多人要求我给源码,因为这是商业项目,公司的产品还没发布,所以我不好公开源码,等公司不用这个版本了,我马上公开源码,不过大家还是静心下来自己解决,不懂的可以发评论,我尽快回复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值