返回

Android 拖拽动画如何取消动画?

Android

如何在 Android 拖拽动画中取消动画

引言

当用户将应用程序拖出当前窗口区域时,我们可能希望打开该应用程序,而不是将其拖到特定位置。这可以实现一个应用程序坞,其中坞上的应用程序可以被拖出,并在拖出时打开。本文将深入探讨如何通过取消动画来实现此功能。

问题

使用拖放事件来检测应用程序是否已成功拖出。当用户开始拖动应用程序时,使用 ACTION_DRAG_STARTED 事件隐藏该应用程序的视图。在 ACTION_DRAG_EXITED 事件中,更新阴影视图以改变视图样式。

问题在于,在用户抬起手指时,ACTION_DRAG_ENDED 事件会带有一个系统动画。此动画无法取消,并且无法在 ACTION_DRAG_ENDED 中更新阴影视图。

解决方案

可以通过设置 MotionEvent.ACTION_CANCEL 标志来取消动画。

步骤

  1. ACTION_DRAG_ENDED 事件中,添加以下行:
event.cancel()
  1. 更新阴影视图以改变视图样式。
  2. 打开应用程序并关闭窗口。

代码示例

DragEvent.ACTION_DRAG_ENDED ->{
            event.cancel()
            (event.localState as View).visibility = View.VISIBLE
            if (!event.result) {
                val v = event.localState as View
                dragShadow.isOutAndDrop = true
                v.updateDragShadow(dragShadow)
                startActivity()
                dismissWindow()
            }
        }

优点

  • 取消动画后,可以立即更新阴影视图,从而获得更平滑的用户体验。
  • 无需修改系统动画。

局限性

  • MotionEvent.ACTION_CANCEL 标志可能会影响其他拖放行为。

常见问题解答

  1. 为什么需要取消动画?
    为了立即更新阴影视图,并获得更平滑的用户体验。

  2. 如何取消动画?
    通过在 ACTION_DRAG_ENDED 事件中设置 MotionEvent.ACTION_CANCEL 标志。

  3. 是否会影响其他拖放行为?
    可能会,但可以根据具体情况进行调整。

  4. 还有什么替代方案?
    没有直接的替代方案,但可以探索其他动画技术。

  5. 是否需要修改系统动画?
    不需要,因为 MotionEvent.ACTION_CANCEL 标志会取消系统动画。

结论

取消拖放动画可以让你获得更平滑的用户体验,并立即更新阴影视图。通过使用 MotionEvent.ACTION_CANCEL 标志,可以轻松实现这一点,而无需修改系统动画。