Android launcher3 Folder文件夹展开时隐藏Workspace、Hotseat、PageIndicatorDots

文件夹展开动画集都写在 FolderAnimationManager.java中,所以可以将隐藏Workspace、Hotseat、PageIndicatorDots的动画写在里面,仿造源码中getAnimator()写的动画,添加对应的即可。

app/src/main/java/com/android/launcher3/folder/FolderAnimationManager.java


    /**
     * Prepares the Folder for animating between open / closed states.
     */
    public AnimatorSet getAnimator() {

......
        for (BubbleTextView icon : mFolder.getItemsOnPage(mFolder.mContent.getCurrentPage())) {
            if (mIsOpening) {
                icon.setTextVisibility(false);
            }
            ObjectAnimator anim = icon.createTextAlphaAnimator(mIsOpening);
            anim.addListener(colorResetListener);
            play(a, anim);
        }

        play(a, getAnimator(mFolder, View.TRANSLATION_X, xDistance, 0f));
        play(a, getAnimator(mFolder, View.TRANSLATION_Y, yDistance, 0f));
        play(a, getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale));
        play(a, mFolderIcon.mFolderName.createTextAlphaAnimator(!mIsOpening));

+       play(a, getAnimator(mLauncher.getHotseat(), View.ALPHA, 1.0f, 0.0f)); 
+       play(a, getAnimator(mLauncher.getWorkspace(), View.ALPHA, 1.0f, 0.0f));
+       play(a, getAnimator(mLauncher.getWorkspace().getPageIndicator(), View.ALPHA, 1.0f, 0.0f));

......
}

其中 Workspace、Hotseat、PageIndicatorDots 的View可以使用如下对应获取到

mLauncher.getWorkspace()
mLauncher.getHotseat()
mLauncher.getWorkspace().getPageIndicator()

在 Folder.java中没有动画的时候,会去执行closeComplete()方法,逻辑如下

app/src/main/java/com/android/launcher3/folder/Folder.java

 @Override
    protected void handleClose(boolean animate) {
        mIsOpen = false;

        if (isEditingName()) {
            mFolderName.dispatchBackKey();
        }

        if (mFolderIcon != null) {
            mFolderIcon.clearLeaveBehindIfExists();
        }
        
        //在animate为false的时候不会走到原来关闭动画的方法,所以需要在closeComplete()方法里面做显示的操作
        if (animate) {
            animateClosed();
        } else {
            closeComplete(false);
            post(this::announceAccessibilityChanges);
        }

     ......

    }

 添加显示方法

private void closeComplete(boolean wasAnimated) {
        
......

        if (getItemCount() <= 1) {
            if (!mDragInProgress && !mSuppressFolderDeletion) {
                replaceFolderWithFinalItem();
            } else if (mDragInProgress) {
                mDeleteFolderOnDropCompleted = true;
            }
        }
        mSuppressFolderDeletion = false;
        clearDragInfo();
        mState = STATE_SMALL;
        mContent.setCurrentPage(0);

+       displayView(mLauncher.getWorkspace().getPageIndicator());
+       displayView(mLauncher.getWorkspace());
+       displayView(mLauncher.getHotseat());

......    
}

 +   private void displayView(View view) {
 +      view.setVisibility(VISIBLE);
 +      view.setAlpha(1.0f);
 +  }

 遇到一个问题:当在文件夹展开然后拖动应用时PageIndicatorDots会显示出来。

排查发现是workspace的过度动画里面会去设置PageIndicatorDots的显示。

在WorkspaceStateTransitionAnimation.java的setWorkspaceProperty()方法中会去setViewAlpha设置PageIndicatorDots透明度。

解决:在文件夹打开时,不去设置PageIndicatorDots透明度为1。

app/src/main/java/com/android/launcher3/WorkspaceStateTransitionAnimation.java


    /**
     * Starts a transition animation for the workspace.
     */
    private void setWorkspaceProperty(LauncherState state, PropertySetter propertySetter,
            AnimatorSetBuilder builder, AnimationConfig config) {
        float[] scaleAndTranslation = state.getWorkspaceScaleAndTranslation(mLauncher);
        mNewScale = scaleAndTranslation[0];
        PageAlphaProvider pageAlphaProvider = state.getWorkspacePageAlphaProvider(mLauncher);
        final int childCount = mWorkspace.getChildCount();
        for (int i = 0; i < childCount; i++) {
            applyChildState(state, (CellLayout) mWorkspace.getChildAt(i), i, pageAlphaProvider,
                    propertySetter, builder, config);
        }

        int elements = state.getVisibleElements(mLauncher);
        Interpolator fadeInterpolator = builder.getInterpolator(ANIM_WORKSPACE_FADE,
                pageAlphaProvider.interpolator);
        boolean playAtomicComponent = config.playAtomicComponent();
        if (playAtomicComponent) {
            Interpolator scaleInterpolator = builder.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT);
            propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, scaleInterpolator);
            float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0;
            propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha,
                    fadeInterpolator);
//当文件夹打开时,不去设置mLauncher.getWorkspace().getPageIndicator()的显示效果
+            AbstractFloatingView openFolder =  AbstractFloatingView.getOpenView(mLauncher, AbstractFloatingView.TYPE_FOLDER);
+            if (openFolder == null) {
+                propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(),
+                 hotseatIconsAlpha, fadeInterpolator);
+    }
......
    }

 其中

AbstractFloatingView.getOpenView(mLauncher, AbstractFloatingView.TYPE_FOLDER)可以判断打开的是否是文件夹view。
完成。
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Android Launcher3中添加文件夹是一项非常简单的任务。首先,您需要确保您的设备装有最新版本的Android Launcher3。然后,按照以下步骤操作: 1. 在您要添加文件夹的主屏幕上,长按应用程序图标并将其拖放到主屏幕上的任何空白区域。 2. 继续将其他应用程序拖放到同一个空白区域。您将看到这些应用程序自动聚合成一个名为“文件夹”的小图标。 3. 现在,单击文件夹并将其重命名为您想要的名称(例如“工具”或“社交媒体”)。 4. 现在,您可以轻触文件夹图标以展开它,并查看其中包含的所有应用程序。您还可以将其他应用程序拖放到文件夹中,或从中删除应用程序。 总的来说,添加文件夹是一个简单,快速的过程,您可以将多个应用程序组织在一起,以增加您的生产力和效率。 ### 回答2: Android Launcher3Android系统中的一个默认桌面应用程序,它提供了许多功能和自定义选项,用户可以根据自己的需求进行个性化配置。 添加文件夹Launcher3中的一个比较简单的操作,步骤如下: 1.长按桌面上的任何一个程序图标或者小部件,直到屏幕上出现菜单。 2.将程序图标或小部件拖到菜单上的“新建文件夹”选项。 3.在弹出的窗口中,输入文件夹的名称,例如“游戏”。 4.点击确定按钮,文件夹就被创建了。 5.将其他程序图标或者小部件拖到这个新建的文件夹中,这样你就可以将类似的应用程序放在一个文件夹里面,方便管理和使用。 除此之外,Launcher3还可以对文件夹进行修改和删除。如果想要修改文件夹名称,可以长按文件夹图标,然后选择重命名选项,在弹出的窗口中修改名称。如果想要删除文件夹,可以将文件夹中的所有应用程序拖出来,然后长按文件夹图标,选择删除选项即可。 总的来说,添加文件夹可以帮助我们更好地组织应用程序,避免出现杂乱无章的情况,同也可以提高我们的使用效率。 ### 回答3: Android Launcher3 是一个开源的 Android 开源项目桌面应用,支持自定义布局、自定义主题、自定义小部件和自定义图标等等功能。其中添加文件夹功能是 Launcher3 的核心功能之一,使用起来非常方便。 添加文件夹的操作步骤如下: 第一步,长按待创建文件夹的应用程序图标,就可以将其拖拽到桌面上。 第二步,将该应用程序图标放置在需要创建文件夹的位置,在放置图标的过程中会出现与其他应用程序图标合并的状态,此可以松手。 第三步,创建完成后,系统会自动弹出文件夹编辑界面,可以对文件夹进行命名修改。 第四步,在文件夹添加应用程序,将所有的应用程序图标全部添加到该文件夹中,避免让桌面太过臃肿。 需要注意的是,Android Launcher3 添加文件夹的功能并不是特别高级,仅能实现简单的文件夹管理,如果需要更加高级的文件夹管理功能,建议使用第三方应用程序或更高级的启动器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值