这个是上篇博客遗留的问题,本来准备和修改文件夹样式一起修改的,但是发现并不是一起的,所以单独列出来;
网上搜了一下,参考这篇博客
Launcher3将hotseat栏固定,禁止拖动,禁止形成文件夹
但是这篇博客的代码和我的代码不一样,于是再次找资源,没发现合适的,只能自己苦逼的看代码。
仍然是参考了那篇博客,我直接在
src/com/android/launcher3/Workspace.java -> createUserFolderIfNecessary()
内部进行判断
boolean createUserFolderIfNecessary(View newView, long container, CellLayout target,
int[] targetCell, float distance, boolean external, DragView dragView,
Runnable postAnimationRunnable) {
//添加判断 begin
if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
return false;
}
//添加判断 end
if (distance > mMaxDistanceForFolderCreation) return false;
View v = target.getChildAt(targetCell[0], targetCell[1]);
......
}
如果是在HotSeat内部就不创建文件夹,运行一下,发现确实有效果;问题来了,这个时候虽然不会创建文件夹,但是在HotSeat中拖动一个APP放到目标APP上方仍然会有一个文件夹的虚影(姑且这么叫它)出现(理想状态应该是目标APP直接被移动到旁边),虽然项目时间要求比较着急,但是这个影响用户体验,所以还是要解决。
刚开始认为跟createUserFolderIfNecessary()这个方法有关系,但是找了一会发现不对;于是顺着这个方法往上找
src/com/android/launcher3/Workspace.java -> onDrop()
./src/com/android/launcher3/dragndrop/DragController.java -> drop()
./src/com/android/launcher3/dragndrop/DragController.java -> onDriverDragEnd()
./src/com/android/launcher3/dragndrop/DragDriver.java -> onTouchEvent();
找到这里就比较明确了,虚影肯定跟这个touch事件有关系的
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
mEventListener.onDriverDragMove(ev.getX(), ev.getY());
break;
case MotionEvent.ACTION_UP:
mEventListener.onDriverDragMove(ev.getX(), ev.getY());
mEventListener.onDriverDragEnd(ev.getX(), ev.getY());
break;
case MotionEvent.ACTION_CANCEL:
mEventListener.onDriverDragCancel();
break;
}
return true;
}
在顺着move时间往下找:
./src/com/android/launcher3/dragndrop/DragController.java -> onDriverDragMove()
./src/com/android/launcher3/dragndrop/DragController.java -> handleMoveEvent()
./src/com/android/launcher3/dragndrop/DragController.java -> checkTouchMove()
src/com/android/launcher3/Workspace.java -> onDragOver()
public void onDragOver(DragObject d) {
......
float targetCellDistance = mDragTargetLayout.getDistanceFromCell(
mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
manageFolderFeedback(mDragTargetLayout, mTargetCell, targetCellDistance, d);
boolean nearestDropOccupied = mDragTargetLayout.isNearestDropLocationOccupied((int)
mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1], item.spanX,
item.spanY, child, mTargetCell);
......
}
在这里看到了manageFolderFeedback(),瞬间觉得自己找到地方了,虽然我英文不好,但是这个feedback还是比较明确了,进入方法看下:
private void manageFolderFeedback(CellLayout targetLayout,
int[] targetCell, float distance, DragObject dragObject) {
if (distance > mMaxDistanceForFolderCreation) return;
final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0], mTargetCell[1]);
ItemInfo info = dragObject.dragInfo;
boolean userFolderPending = willCreateUserFolder(info, dragOverView, false);
凭感觉,应该就是这个地方了(willCreateUserFolder()),我们添加一个判断
boolean userFolderPending = willCreateUserFolder(info, dragOverView, false)
&& !mLauncher.isHotseatLayout(targetLayout);
运行一下,解决这个问题。
到目前位置,整个Launcher已经基本可用了!