android - 使用 WindowManager.updateViewLayout() 获取 View 以动画化到其新位置

标签 android window-managers

我使用 WindowManager.updateViewLayout() 向 WindowManager 添加了一个 View .

然后我将一个 onTouch 监听器附加到它,并使其“跟随”用户的手指(拖动)。我通过更改我在 updateViewLayout 中传递的 WindowManager.LayoutParams 的 x 和 y 值来执行此操作。

当用户抬起手指时,我希望 View 根据距离更近的位置在屏幕的左/右边缘进行动画处理。 我得到的效果是 View 立即贴在边缘,没有任何动画。

如果 View 的宽度/高度发生剧烈变化(随之而来的是 WindowManager.LayoutParams 的宽度/高度), View 将以动画方式移动到它的新位置。

有没有办法让它在仅更改 x/y 值(不改变宽度/高度)后进行动画处理?

最佳答案

你可以这样做:每当你抬起手指时运行一个动画器:

// <inside switch case in your touchEvent handling>  
// params variable is your view's params

case MotionEvent.ACTION_UP:
    ValueAnimator va = ValueAnimator.ofFloat(params.x, 0);
    int mDuration = 250;
    va.setDuration(mDuration);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        public void onAnimationUpdate(ValueAnimator animation) {
           params.x = Math.round((Float) animation.getAnimatedValue());
           mWindowManager.updateViewLayout(mOverlayView, params);
        }
    });
    va.start();

当您松开手指时,此代码始终将其移动到屏幕的左边缘。您可以通过跟踪 View 的坐标并检查屏幕中间然后更改动画目标来解决这个问题。

关于android - 使用 WindowManager.updateViewLayout() 获取 View 以动画化到其新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24944875/

相关文章:

java - 通过 main 追加另一个 Activity 的 TextView

android - 无法对非静态方法 findviewbyid(int) TextView 进行静态引用

linux - 阻止 MPlayer 在 Awesome WM 中使用 float

Xvfb - 启动或附加一个窗口管理器到 xvfb

linux - 如何对 AwesomeWM 文本时钟小部件实现序数日?

haskell - xmonad 垂直调整图 block /窗口的大小

java - Android TextView中的阿拉伯日期显示

java - 需要解释 OpenCV Android 行为

java - API < 21 的 Android 复选框按钮样式

android - WindowManager 中 View 的 onConfigurationChanged 工作不可靠