模式就是界面,除普通模式外,Launcher还有两个特殊模式,分别是overView模式和Springloader模式。此处采用状态模式这种设计模式,共有三个状态。
overView模式是长按桌面空白处,出现特殊功能,比如设置壁纸,添加widget,特殊设置(横屏开关,负一屏开关等),设置主屏幕(点击home键自动移动到的cellLayout),删除屏幕等。
Springloader模式又叫拖拽模式,用户想改变CellLayout里面的布局,就是通过拖拽图标,widget等来改变其位置,这个模式叫做拖拽模式。
正常模式,overView模式和SpringLoader模式就构成了正常的Launcher三个核心交互。
点击和滑动构成了普通模式,而长按则是overView模式和SpringLoader模式的起始因素。
Launcher 实现了OnLongClickListener接口。
源码如下:
@Override
public boolean onLongClick(View v) {
//首先进行三种判断,其实质:如果当前状态处于其他状态返回Launcher状态的途中,或者Launcher的布局还没有读取完成,则不进行后续操作。因为在以上两种状态,进行后面的操作会出故障,此外,以上两种状态持续时间非常短暂,所以考虑为用户误操作且这一瞬间操作无用。 比如说拖拽完图标后,我们能看到从springload模式进入普通模式的过程,这个过程中,长按桌面是没有任何作用的。
if (!isDraggingEnabled()) return false;
if (isWorkspaceLocked()) return false;
if (mState != State.WORKSPACE) return false;
//后面判断方法和onclick有些类似,一次判断是点击的哪里来进行对应处理,首先如果长按的是allapp入口,则打开allapp。对于allapp按钮,点击和长按一个效果。Allapp按钮在Launcher8.0里是hotseat上面的indicator上面的小三角符号。
if ((FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP && v instanceof PageIndicator) ||
(v == mAllAppsButton && mAllAppsButton != null)) {
onLongClickAllAppsButton(v);
return true;
}
//如果用户点击的是桌面空白处,则从普通模式进入overView模式,也是手机里面的长按空白出现下方快捷操作栏的行为,这是最常见的操作。
if (v instanceof Workspace) {
if (!mWorkspace.isInOverviewMode()) {
if (!mWorkspace.isTouchActive() && !ignoreLongPressToOverview) {