Android8.1 Launcher3 禁止在HotSeat创建文件夹

Android8.1 Launcher3 禁止在HotSeat创建文件夹

这个是上篇博客遗留的问题,本来准备和修改文件夹样式一起修改的,但是发现并不是一起的,所以单独列出来;
网上搜了一下,参考这篇博客
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已经基本可用了!

猜你喜欢

转载自blog.csdn.net/qq_30552095/article/details/80513266