使用WindowManager.updateViewLayout()获取视图以设置其新位置的动画

dor*_*ors 6 android window-managers

我使用WindowManager.updateViewLayout()向WindowManager添加一个视图.

然后我将onTouch监听器附加到它上面,并使其"跟随"用户的手指(拖动).我这样做是通过更改我在updateViewLayout中传递的WindowManager.LayoutParams的x和y值来实现的.

当用户抬起手指时,我希望视图根据其靠近的位置设置为屏幕左/右边缘的动画.我得到的效果是视图立即粘到边缘,没有任何动画.

如果视图的宽度/高度变化很难(并且随后是WindowManager.LayoutParams的宽度/高度),则视图会动画到其新位置.

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

Ada*_*dam 6

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

// <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();
Run Code Online (Sandbox Code Playgroud)

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