【发布时间】: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