【问题标题】:Spring Animations on WindowManager ViewWindowManager 视图上的 Spring 动画
【发布时间】:2019-06-20 04:42:30
【问题描述】:

首先,如果您愿意花时间来解决我遇到的这个大问题,谢谢!已经在 SO 上提出了各种形式的这个问题,但我还没有找到一个可以处理我今天遇到的相同错误的问题。

TLDR; My icon disappears

我和许多其他人一样,创建了一个浮动聊天头。我尝试使用 Android SDK 中的 DynamicAnimation 库对其进行动画处理,但动画开始时视图开始消失。

mFloatingView的声明和实例化:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0
params.y = 0;

mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingView, params);

在以下情况下,我将视图移动到当前触摸位置:

case MotionEvent.ACTION_MOVE:
    //Calculate the X and Y coordinates of the view.
    params.x = initialX + (int) (event.getRawX() - initialTouchX);
    params.y = initialY + (int) (event.getRawY() - initialTouchY);


    //Update the layout with new X & Y coordinate
    mWindowManager.updateViewLayout(mFloatingView, params);
    return true;

然后,当我抬起手指时,它会使用以下动画将视图动画到最近的边缘:

case MotionEvent.ACTION_UP:

    SpringAnimation animationX = new SpringAnimation(mFloatingView, SpringAnimation.X);

    SpringForce springForce = new SpringForce(desinationXValue);
    springForce.setStiffness(SpringForce.STIFFNESS_LOW);
    springForce.setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY);

    animation.setSpring(springForce);

    animationX.addUpdateListener(new DynamicAnimation.OnAnimationUpdateListener() {

        public void onAnimationUpdate(DynamicAnimation dynamicAnimation, float value, float velocity) {
            params.x = (int) value;

            // IMPORTANT CODE
            mWindowManager.updateViewLayout(mFloatingView, params);
        }
    });
    return true;

使用上面的代码,当我移动图标时,使用updateViewLayout(mFloatingView, params) 可以看到视图。当我释放它并开始动画时,图标动画,但视图的根保持在原位,因此图标仅在其原始角落可见。

为什么updateViewLayout(mFloatingView, params) 会在ACTION_MOVE 的情况下移动视图的根,而不是在onAnimationUpdate 中移动动画的每一帧?

为了清楚起见,我添加了一个video of the issue. 请注意,当从原始角落拉出时,该图标可见,但从不可见角落拉出时则不可见。

【问题讨论】:

  • 是的,这就像一个魅力,非常感谢!你能解释一下为什么这在答案中有效,我会接受吗?
  • 你是怎么解决这个问题的?我有同样的问题,无法弄清楚:(
  • 帮助我的评论不幸被删除了。如果我没记错的话,我将 SpringAnimation 移到了一个名为 SpringListener 的新类中,它实现了动画更新监听器。因此,在我的 floatingview 服务中,我将 mFloatingView 上的 OnTouchListener 设置为 SpringListener 的新实例,该实例将处理所有动画更新代码。将所有动画代码移至其他类解决了问题,原因我仍然不知道
  • @BenGraham 我也有同样的问题,你能不能给我一些代码
  • @BenGraham 请更新您的答案,因为很多人遇到同样的问题,我几乎花了一个星期,但没有找到任何解决方案

标签: android android-animation android-windowmanager


【解决方案1】:

转换这个

SpringAnimation animationX = new SpringAnimation(mFloatingView, SpringAnimation.X);

SpringAnimation animationX = new SpringAnimation(new FloatValueHolder());

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多