Launcher3源码分析 — bindScreen的具体实现
来源:互联网 发布:哈希排序算法 编辑:程序博客网 时间:2024/04/27 21:22
前面讲到,在bindWorkspace中涉及了以下几个回调方法:
startBinding();bindScreens();bindWorkspaceItems();finishBindingItems();
Launcher类实现了这些回调接口,startBinding()主要完成了数据清空和状态重置等预备操作,这里不详细分析,接下来我们来看其他方法在Launcher类中的具体实现。
我们从bindScreen()开始,bindScreen完成了页面的添加工作,下面是页面添加的流程图:
由图可以看出,有3种类型的screen,有序Screen列表中包含的非空页面,空页面和自定义页面。在Launcher类中,bindScreens()的具体实现如下:
@Overridepublic void bindScreens(ArrayList<Long> orderedScreenIds) { // 根据orderedScreenIds来添加页面 bindAddScreens(orderedScreenIds); // 如果orderedScreenIds的大小为0,即没有添加任何页面,需要添加一个空的页面 if (orderedScreenIds.size() == 0) { mWorkspace.addExtraEmptyScreen(); } // 如果有自定义页面,则将自定义页面添加到最左 if (!mWorkspace.hasCustomContent() && hasCustomContentToLeft()) { mWorkspace.createCustomContentPage(); }}
@Overridepublic void bindAddScreens(ArrayList<Long> orderedScreenIds) { int count = orderedScreenIds.size(); for (int i = 0; i < count; i++) { mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i)); }}
从insertNewWorkspaceScreenBeforeEmptyScreen()的名字可以看出,该方法的作用是把页面插到空页面之前,代码如下:
public long insertNewWorkspaceScreenBeforeEmptyScreen(long screenId) { // 查找页面插入的索引位置,如果有空页面,则在空页面之前插入 int insertIndex = mScreenOrder.indexOf(EXTRA_EMPTY_SCREEN_ID); if (insertIndex < 0) { insertIndex = mScreenOrder.size(); } // 根据页面id和插入位置进行页面的插入 return insertNewWorkspaceScreen(screenId, insertIndex); }
在Workspace中维护了两个与页面相关的集合:
// 存储页面id为key,页面视图为value的HashMap private HashMap<Long, CellLayout> mWorkspaceScreens = new HashMap<Long, CellLayout>(); // 有序的页面id列表 private ArrayList<Long> mScreenOrder = new ArrayList<Long>();
insertNewWorkspaceScreen完成了页面创建和插入操作,具体代码如下:
public long insertNewWorkspaceScreen(long screenId, int insertIndex) { if (mWorkspaceScreens.containsKey(screenId)) { throw new RuntimeException("Screen id " + screenId + " already exists!"); } // 创建页面视图 CellLayout newScreen = (CellLayout) mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null); // 设置点击事件 newScreen.setOnLongClickListener(mLongClickListener); newScreen.setOnClickListener(mLauncher); newScreen.setSoundEffectsEnabled(false); // 添加到相应的页面集合 mWorkspaceScreens.put(screenId, newScreen); mScreenOrder.add(insertIndex, screenId); // 将页面添加到Workspace中 addView(newScreen, insertIndex); return screenId; }
public boolean addExtraEmptyScreen() { // 空页面的id为EXTRA_EMPTY_SCREEN_ID if (!mWorkspaceScreens.containsKey(EXTRA_EMPTY_SCREEN_ID)) { // 没有指定插入的位置,则添加到最后的位置 insertNewWorkspaceScreen(EXTRA_EMPTY_SCREEN_ID); return true; } return false; }
public void createCustomContentPage() { CellLayout customScreen = (CellLayout) mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null); mWorkspaceScreens.put(CUSTOM_CONTENT_SCREEN_ID, customScreen); mScreenOrder.add(0, CUSTOM_CONTENT_SCREEN_ID); // We want no padding on the custom content customScreen.setPadding(0, 0, 0, 0); addFullScreenPage(customScreen); // Ensure that the current page and default page are maintained. mDefaultPage = mOriginalDefaultPage + 1; // Update the custom content hint mLauncher.updateCustomContentHintVisibility(); if (mRestorePage != INVALID_RESTORE_PAGE) { mRestorePage = mRestorePage + 1; } else { setCurrentPage(getCurrentPage() + 1); } }
private final static long EXTRA_EMPTY_SCREEN_ID = -201; private final static long CUSTOM_CONTENT_SCREEN_ID = -301;
1 0
- Launcher3源码分析 — bindScreen的具体实现
- Launcher3源码分析 — bindWorkspaceItems的具体实现
- Launcher3源码分析 — 加载Workspace的数据
- Launcher3源码分析 — 主界面的UI结构
- Launcher3源码分析 — 加载Workspace的数据
- Launcher3源码分析 — 加载Workspace的数据 .
- Launcher3源码分析——去掉cling
- Launcher3源码分析 — ui结构
- Launcher3源码分析 — 启动过程
- Launcher3源码分析 — 数据加载过程
- Launcher3源码分析 — ui结构
- Launcher3源码分析 — 启动过程
- Launcher3源码分析 — 数据加载过程
- Launcher3源码分析
- Launcher3源码分析(Workspace)
- Launcher3源码分析(CellLayout)
- Launcher3源码分析(DeviceProfile)
- 基于Android7.0的Launcher3源码分析(1)——框架设计分析
- mysql给表添加字段的命令
- 长方体类
- android Java StringBuffer对象的append方法
- ContiPerf介绍
- 第五周——三角形类的构造函数(1)
- Launcher3源码分析 — bindScreen的具体实现
- Java内存模型与线程规范(JSR 133)中文版
- eclipse 安装svn 使用总结
- 三角形类构造函数
- Java字符串之性能优化
- 在Android 4.0中Contacts 通话记录界面跳转通话详情的是如何实现的(精析)
- 黑马程序员--------------银行业务调度系统
- hdu 1598 枚举+并差集
- 如何在iOS 7中设置barTintColor实现类似网易和 Facebook 的 navigationBar 效果