栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

launcher架构解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

launcher架构解析

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

  1. android:id="@+id/delete_zone"

  2. android:layout_width="@dimen/delete_zone_size"

  3. android:layout_height="@dimen/delete_zone_size"

  4. android:paddingTop="@dimen/delete_zone_padding"

  5. android:layout_gravity=“bottom|center_horizontal”

  6. android:scaleType=“center”

  7. android:src="@drawable/delete_zone_selector"

  8. android:visibility=“invisible”

  9. launcher:direction=“horizontal”

  10. />

在launcher.xml中,可以发现,DeleteZone默认是不显示的android:visibility=“invisible”,但是我们每次开始拖放图标的时候DeleteZone就显示了,这个功能是如何实现的呢?在代码中可以发现DeleteZone实现了DragController.DragListener接口,

[html]  view plain copy

  1. public class DeleteZone extends ImageView implements DropTarget, DragController.DragListener

DragListener提供两个接口方法,

onDragStart:隐藏把手,显示DeleteZone

onDragEnd:显示把手,隐藏DeleteZone

在DeleteZone中,看一下代码:

[java]  view plain copy

  1. public void onDragStart(DragSource source, Object info, int dragAction) {

  2. final ItemInfo item = (ItemInfo) info;

  3. if (item != null) {

  4. mTrashMode = true;

  5. createAnimations();

  6. final int[] location = mLocation;

  7. getLocationOnScreen(location);

  8. mRegion.set(location[0], location[1], location[0] + mRight - mLeft,

  9. location[1] + mBottom - mTop);

  10. mDragController.setDeleteRegion(mRegion);

  11. mTransition.resetTransition();

  12. startAnimation(mInAnimation);

  13. mHandle.startAnimation(mHandleOutAnimation);

  14. setVisibility(VISIBLE);

  15. }

  16. }

  17. public void onDragEnd() {

  18. if (mTrashMode) {

  19. mTrashMode = false;

  20. mDragController.setDeleteRegion(null);

  21. startAnimation(mOutAnimation);

  22. mHandle.startAnimation(mHandleInAnimation);

  23. setVisibility(GONE);

  24. }

  25. }

分别在开始DragController开始拖放和结束拖放的时候被调用.

另外DeleteZone实现了DropTarget接口的onDrop方法

[java]  view plain copy

  1. public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,

  2. DragView dragView, Object dragInfo) {

  3. final ItemInfo item = (ItemInfo) dragInfo;

  4. if (item.container == -1) return;

  5. if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {

  6. if (item instanceof LauncherAppWidgetInfo) {

  7. mLauncher.removeAppWidget((LauncherAppWidgetInfo) item);

  8. }

  9. } else {

  10. if (source instanceof UserFolder) {

  11. final UserFolder userFolder = (UserFolder) source;

  12. final UserFolderInfo userFolderInfo = (UserFolderInfo) userFolder.getInfo();

  13. // Item must be a ShortcutInfo otherwise it couldn’t have been in the folder

  14. // in the first place.

  15. userFolderInfo.remove((ShortcutInfo)item);

  16. }

  17. }

  18. if (item instanceof UserFolderInfo) {

  19. final UserFolderInfo userFolderInfo = (UserFolderInfo)item;

  20. LauncherModel.deleteUserFolderContentsFromDatabase(mLauncher, userFolderInfo);

  21. mLauncher.removeFolder(userFolderInfo);

  22. } else if (item instanceof LauncherAppWidgetInfo) {

  23. final LauncherAppWidgetInfo launcherAppWidgetInfo = (LauncherAppWidgetInfo) item;

  24. final LauncherAppWidgetHost appWidgetHost = mLauncher.getAppWidgetHost();

  25. if (appWidgetHost != null) {

  26. final int appWidgetId = launcherAppWidgetInfo.appWidgetId;

  27. // Deleting an app widget ID is a void call but writes to disk before returning

  28. // to the caller…

  29. new Thread(“deleteAppWidgetId”) {

  30. public void run() {

  31. appWidgetHost.deleteAppWidgetId(launcherAppWidgetInfo.appWidgetId);

  32. }

  33. }.start();

  34. }

  35. }

  36. LauncherModel.deleteItemFromDatabase(mLauncher, item);

  37. }

当把图标拖放到DeleteZone,就会调用DeleteZone,实现的onDrop方法对应用图标进行删除处理。

3.屏幕左右移动按钮,就是使用的ImageView,

[html]  view plain copy

  1. android:id="@+id/previous_screen"

  2. android:layout_width=“93dip”

  3. android:layout_height="@dimen/button_bar_height"

  4. android:layout_gravity=“bottom|left”

  5. android:layout_marginLeft=“6dip”

  6. android:scaleType=“center”

  7. android:src="@drawable/home_arrows_left"

  8. android:onClick=“previousScreen”

  9. android:focusable=“true”

  10. android:clickable=“true” />

  11. android:id="@+id/next_screen"

  12. android:layout_width=“93dip”

  13. android:layout_height="@dimen/button_bar_height"

  14. android:layout_gravity=“bottom|right”

  15. android:layout_marginRight=“6dip”

  16. android:scaleType=“center”

  17. android:src="@drawable/home_arrows_right"

  18. android:onClick=“nextScreen”

  19. android:focusable=“true”

  20. 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

  1. @SuppressWarnings({“UnusedDeclaration”})

  2. publicvoid previousScreen(View v) {

  3. if(!isAllAppsVisible()) {

  4. mWorkspace.scrollLeft();

  5. }

  6. }

–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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/695367.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号