WindowManager视图上的Spring动画

时间:2017-08-01 03:58:50

标签: android android-animation android-windowmanager

首先,如果您花时间处理我曾经遇到的这个大问题,谢谢!在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.注意,从原始角落拉出图标时可以看到图标,但是当从不可见的角落拉出时图标不可见。

1 个答案:

答案 0 :(得分:0)

转换此

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

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