安卓 linux launcher,Android之Launcher的小试心得

Launcher是Android系统的"桌面",在android2.1之前采用的是launcher,android2.2之后采用的launcher2,他们之间最大的区别是launcher2有3D效果,不过launcher2整个系统的代码的改动还是比较大的。

相关阅读 : Android开发:为launcher添加一个仿Mac的Dock(附源码) http://www.linuxidc.com/Linux/2011-09/44161.htm

首先来介绍下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拖入拖出,首先上一张已经做出来的效果图:

51cbe1daff1be1aee180fb9db2848f80.png

我首先列出我完成的几个主要源文件:

DockProvider:持久化dock Item的元素。

DockSettings:dock一些元素和uri信息。

DockView:显示icon的布局,继承LinearLayout实现DropTarget,DragSource, DragController.DragListener,OnClickListener, View.OnLongClickListener接口。

我在这里主要说下,实现原理,DockView是主要文件,它继承LinearLayout是为了它里面的元素水平摆放,直接用addView继承实现,继承系统的那些接口都是为了,接收到icon拖动的状态和信息。

首先要在Launcher的setupViews函数里面初始化自己的layout,代码如下:private void setupViews() {

mDragLayer = (DragLayer) findViewById(R.id.drag_layer);

final DragLayer dragLayer = mDragLayer;

mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);

final Workspace workspace = mWorkspace;

/*mDrawer = (SlidingDrawer) dragLayer.findViewById(R.id.drawer);

final SlidingDrawer drawer = mDrawer;*/

mAllAppsGrid = (AllAppsGridView) dragLayer.findViewById(R.id.content);

dock_view=(DockView)dragLayer.findViewById(R.id.dock_view);

dock_view.setLauncher(this);

dock_view.setDragger(mDragLayer);

dock_view.init();

//mAllAppsGrid.setVisibility(View.GONE);

final AllAppsGridView grid = mAllAppsGrid;

final DeleteZone deleteZone = (DeleteZone) dragLayer.findViewById(R.id.delete_zone);

mHandleView = (HandleView) dragLayer.findViewById(R.id.all_apps);

mHandleView.setLauncher(this);

//mHandleIcon = (TransitionDrawable) mHandleView.getDrawable();

//mHandleIcon.setCrossFadeEnabled(true);

//author:jezz

main_apps=(RelativeLayout)dragLayer.findViewById(R.id.main_apps);

home=(ImageView)dragLayer.findViewById(R.id.all_home);

main_apps.setVisibility(View.GONE);

mHandleView.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

onMainOpened(true);

}

});

home.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

onMainClosed(true);

}

});

/*drawer.lock();

final DrawerManager drawerManager = new DrawerManager();

drawer.setOnDrawerOpenListener(drawerManager);

drawer.setOnDrawerCloseListener(drawerManager);

drawer.setOnDrawerScrollListener(drawerManager);*/

grid.setTextFilterEnabled(false);

grid.setDragger(dragLayer);

grid.setLauncher(this);

workspace.setOnLongClickListener(this);

workspace.setDragger(dragLayer);

workspace.setLauncher(this);

deleteZone.setLauncher(this);

deleteZone.setDragController(dragLayer);

deleteZone.setHandle(mHandleView);

dragLayer.setIgnoredDropTarget(grid);

dragLayer.setDragScoller(workspace);

dragLayer.setDragListener(deleteZone);

dragLayer.setDockDragListener(dock_view);

dock_view.setWorkspace(workspace);

}

DragLayer添加触发的事件:if (mListener != null) {

mListener.onDragStart(v, source, dragInfo, dragAction);

}

if(mDockListener!=null){

mDockListener.onDragStart(v, source, dragInfo, dragAction);

}以上两个细节地址,还有很多细节都要改,如你的dock区域是不让用户拖入的,所以在底部区别你要创建一个Rect,让这个Rect区域为禁用,再就是有个细节的地方注意:当用户卸载程序的时候你的icon也要跟着一起删除,不过他已经写好了,ApplicationsIntentReceiver,你在其中加下你的删除逻辑就可以了。0b1331709591d260c1c78e86d0c51c18.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值