LauncherApplication:在VM中设置参数
LauncherAppWidgetHost,LauncherAppWidgetHostView,:Widget相关
LauncherModel: MVC中的M,里面有许多封装的对数据库的操作。包含几个线程,其中最主要的是ApplicationsLoader和DesktopItemsLoader。ApplicationsLoader在加载所有应用程序时使用,DesktopItemsLoader在加载workspace的时候使用。其他的函数就是对数据库的封装,比如在删除,替换,添加程序的时候做更新数据库和UI的工作。
LauncherProvider***launcher的数据库,一个contentprovider里面存储了桌面的item的信息。在创建数据库的时候会loadFavorites(db)方法,loadFavorites()会解析xml目录下的default_workspace.xml文件,把其中的内容读出来写到数据库中,这样就做到了桌面的预制。
LauncherSettings:设置相关的工具,数据库项的字符串定义,另外在这里定义了container的类型,还有itemType的定义,除此还有一些特殊的widget(如search,clock的定义等)的类型定义。
LiveFolder,LiveFolderAdapter,LiveFolderIcon,LiveFolderInfo: livefolder相关
Search: 搜索
UserFolder,UserFolderInfo:文件夹包含applications,shortcuts
Utilities:小工具
WallpaperChooser:选择wallpaper的activity
Workspace:整个界面layout,几个窗口就是他下面的子节点。
widget : 代表启动的widget实例,例如搜索
在桌面中,有一下四种类型的对象:
1. ITEM_SHORTCUT,应用快捷方式,对应实现布局文件R.layout.application
2. ITEM_APPWIDGET,app widget 桌面组件
3. ITEM_LIVE_FOLDER,文件夹
–UserFolderInfo 对应实现布局文件R.layout.folder_icon
–LiveFolderInfo 对应实现布局文件R.layout.live_folder_icon
4. ITEM_WALLPAPER,墙纸。
下面,我们详细的来说一下launcher里面的详细功能:
1.DragLayer–DragLayer继承frameLayout,并在此基础上组合了DragController实现拖放功能,DragLayer主要监听下面两个用户事件onInterceptTouchEvent和onTouchEvent
并交给DragController进行处理,DragController根据是否在拖放中等信息控制控件拖放过程处理。DragLayer 是Launcher这个activity的顶层view,其实在Launcher2这个应用只有Laucher.java这么一个activity。
2.DeleteZone–
[html] view plain copy
-
-
android:id="@+id/delete_zone"
-
android:layout_width="@dimen/delete_zone_size"
-
android:layout_height="@dimen/delete_zone_size"
-
android:paddingTop="@dimen/delete_zone_padding"
-
android:layout_gravity=“bottom|center_horizontal”
-
android:scaleType=“center”
-
android:src="@drawable/delete_zone_selector"
-
android:visibility=“invisible”
-
launcher:direction=“horizontal”
-
/>
在launcher.xml中,可以发现,DeleteZone默认是不显示的android:visibility=“invisible”,但是我们每次开始拖放图标的时候DeleteZone就显示了,这个功能是如何实现的呢?在代码中可以发现DeleteZone实现了DragController.DragListener接口,
[html] view plain copy
- public class DeleteZone extends ImageView implements DropTarget, DragController.DragListener
DragListener提供两个接口方法,
onDragStart:隐藏把手,显示DeleteZone
onDragEnd:显示把手,隐藏DeleteZone
在DeleteZone中,看一下代码:
[java] view plain copy
-
public void onDragStart(DragSource source, Object info, int dragAction) {
-
final ItemInfo item = (ItemInfo) info;
-
if (item != null) {
-
mTrashMode = true;
-
createAnimations();
-
final int[] location = mLocation;
-
getLocationOnScreen(location);
-
mRegion.set(location[0], location[1], location[0] + mRight - mLeft,
-
location[1] + mBottom - mTop);
-
mDragController.setDeleteRegion(mRegion);
-
mTransition.resetTransition();
-
startAnimation(mInAnimation);
-
mHandle.startAnimation(mHandleOutAnimation);
-
setVisibility(VISIBLE);
-
}
-
}
-
public void onDragEnd() {
-
if (mTrashMode) {
-
mTrashMode = false;
-
mDragController.setDeleteRegion(null);
-
startAnimation(mOutAnimation);
-
mHandle.startAnimation(mHandleInAnimation);
-
setVisibility(GONE);
-
}
-
}
分别在开始DragController开始拖放和结束拖放的时候被调用.
另外DeleteZone实现了DropTarget接口的onDrop方法
[java] view plain copy
-
public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
-
DragView dragView, Object dragInfo) {
-
final ItemInfo item = (ItemInfo) dragInfo;
-
if (item.container == -1) return;
-
if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
-
if (item instanceof LauncherAppWidgetInfo) {
-
mLauncher.removeAppWidget((LauncherAppWidgetInfo) item);
-
}
-
} else {
-
if (source instanceof UserFolder) {
-
final UserFolder userFolder = (UserFolder) source;
-
final UserFolderInfo userFolderInfo = (UserFolderInfo) userFolder.getInfo();
-
// Item must be a ShortcutInfo otherwise it couldn’t have been in the folder
-
// in the first place.
-
userFolderInfo.remove((ShortcutInfo)item);
-
}
-
}
-
if (item instanceof UserFolderInfo) {
-
final UserFolderInfo userFolderInfo = (UserFolderInfo)item;
-
LauncherModel.deleteUserFolderContentsFromDatabase(mLauncher, userFolderInfo);
-
mLauncher.removeFolder(userFolderInfo);
-
} else if (item instanceof LauncherAppWidgetInfo) {
-
final LauncherAppWidgetInfo launcherAppWidgetInfo = (LauncherAppWidgetInfo) item;
-
final LauncherAppWidgetHost appWidgetHost = mLauncher.getAppWidgetHost();
-
if (appWidgetHost != null) {
-
final int appWidgetId = launcherAppWidgetInfo.appWidgetId;
-
// Deleting an app widget ID is a void call but writes to disk before returning
-
// to the caller…
-
new Thread(“deleteAppWidgetId”) {
-
public void run() {
-
appWidgetHost.deleteAppWidgetId(launcherAppWidgetInfo.appWidgetId);
-
}
-
}.start();
-
}
-
}
-
LauncherModel.deleteItemFromDatabase(mLauncher, item);
-
}
当把图标拖放到DeleteZone,就会调用DeleteZone,实现的onDrop方法对应用图标进行删除处理。
3.屏幕左右移动按钮,就是使用的ImageView,
[html] view plain copy
-
-
android:id="@+id/previous_screen"
-
android:layout_width=“93dip”
-
android:layout_height="@dimen/button_bar_height"
-
android:layout_gravity=“bottom|left”
-
android:layout_marginLeft=“6dip”
-
android:scaleType=“center”
-
android:src="@drawable/home_arrows_left"
-
android:onClick=“previousScreen”
-
android:focusable=“true”
-
android:clickable=“true” />
-
-
android:id="@+id/next_screen"
-
android:layout_width=“93dip”
-
android:layout_height="@dimen/button_bar_height"
-
android:layout_gravity=“bottom|right”
-
android:layout_marginRight=“6dip”
-
android:scaleType=“center”
-
android:src="@drawable/home_arrows_right"
-
android:onClick=“nextScreen”
-
android:focusable=“true”
-
android:clickable=“true” />
注意三点,
–1.桌面左右移动时Drawable的变换,变换图标列表可查看home_arrows_right.xml
,ImageView通过把drawable传递给worksapce,当桌面切换时通过调用Drawable.setLevel()方法实现不同图标显示。
–2.当点击实现左右桌面切换,查看上面的布局文件中android:onClick=“previousScreen”,该属性定义了一个 onClick事件响应函数,在Launcher.java中的788行。
[html] view plain copy
-
@SuppressWarnings({“UnusedDeclaration”})
-
publicvoid previousScreen(View v) {
-
if(!isAllAppsVisible()) {
-
mWorkspace.scrollLeft();
-
}
-
}
–3.在(Launcher.setupViews)中添加了长按事件OnLongClickListener有当长按会执行launcher.onlongclick方法,方法执行显示5个桌面的预览微缩图显示。
4.RelativeLayout–android:id="@+id/all_apps_button_cluster",如前面截图右边灰色竖状条,它是一个相对布局对象,上面承载了三个view
中间是一个HandleView,是一个进入allappview的按钮,HandleView的左面是拨号,右面是浏览器两个ImageView。
–HandleView
–1.点击事件 传递给Launcher.onClick进行处理 显示应用菜单view



