首先,如果您花时间处理我曾经遇到的这个大问题,谢谢!在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.注意,从原始角落拉出图标时可以看到图标,但是当从不可见的角落拉出时图标不可见。
答案 0 :(得分:0)
转换此
SpringAnimation animationX = new SpringAnimation(mFloatingView, SpringAnimation.X);
到
SpringAnimation animationX = new SpringAnimation(new FloatValueHolder());