ValueAnimator中的Android宽度动画冲突
我试图用动画来扩展和缩小容器的宽度。 我正在使用ValueAnimator中的Android宽度动画冲突,android,animation,android-animation,Android,Animation,Android Animation,我试图用动画来扩展和缩小容器的宽度。 我正在使用ValueAnimator进行这两项工作,并且这两项工作都很好。 当用户向上滚动卡片时,将执行展开动画;当用户向下滚动卡片时,将执行收缩动画 因为所有这些卡都在ScrollView容器中,所以用户可以随时向上/向下滚动,即使扩展/收缩动画尚未完成 更清楚地说,看起来收缩动画是在卡仍在扩展时触发的。下面是我的扩展/收缩代码 private void animateResizeWidth(final View vcLogin, int widthRed
ValueAnimator
进行这两项工作,并且这两项工作都很好。
当用户向上滚动卡片时,将执行展开动画;当用户向下滚动卡片时,将执行收缩动画
因为所有这些卡都在ScrollView
容器中,所以用户可以随时向上/向下滚动,即使扩展/收缩动画尚未完成
更清楚地说,看起来收缩动画是在卡仍在扩展时触发的。下面是我的扩展/收缩代码
private void animateResizeWidth(final View vcLogin, int widthReduce){
ValueAnimator anim;
if(widthReduce == 0){
anim = ValueAnimator.ofInt((ScreenUtils.getObjInstance().getPixelFromDPI(CARD_WIDTH) - ScreenUtils.getObjInstance().getPixelFromDPI(widthReduce)), ScreenUtils.getObjInstance().getPixelFromDPI(CARD_WIDTH));
}else{
anim = ValueAnimator.ofInt(ScreenUtils.getObjInstance().getPixelFromDPI(CARD_WIDTH), (ScreenUtils.getObjInstance().getPixelFromDPI(CARD_WIDTH) - ScreenUtils.getObjInstance().getPixelFromDPI(widthReduce)));
}
final RelativeLayout.LayoutParams finalLp2 = new RelativeLayout.LayoutParams(vcLogin.getLayoutParams());
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int val = (Integer) valueAnimator.getAnimatedValue();
finalLp2.width = val;
finalLp2.addRule(RelativeLayout.CENTER_HORIZONTAL);
vcLogin.setLayoutParams(finalLp2);
vcLogin.invalidate();
}
});
anim.setDuration(400);
anim.start();
}
因此,每当发生这种情况时,卡的大小将被设置为常规大小,并且调整大小动画将不再触发(需要重新启动主机活动)
我已经试过了你的答案。但是,这对我没有帮助
我的问题是1:是否有其他动画机制 除了ValueAnimator,我可以使用宽度动画?我查过了 ObjectAnimator,但不支持
2:那是线吗 问题
3:我不应该阻止用户向下滚动 只是因为我的扩展动画还没有完成。那么,我还没有 记住,如果用户向下滚动,我将终止任何 挂起的动画。对于这个方法,我需要考虑什么线程相关的问题吗?(我写了一个习惯 ScrollView以检测那些与滚动相关的事件。) 我认为在上述动画实现中缺少了一些线程安全逻辑。
谢谢线程?你不使用任何非UI线程。。。您是否尝试了requestLayout(),而不是invalidate()?仍然相同。顺序是(1)卡根据用户滚动向下移动(2),而向下移动时,卡的宽度正在扩展。当用户向上滚动时,顺序是(1)卡向上移动到上一个位置[y](2)卡的宽度正在缩小。问题是,当用户在扩展卡时向上滚动时,我认为onAnimationUpdate的布局参数更新被中断。在那之后,任何宽度动画都不会被触发。我所说的线程就像一个“死锁机制”。当一件事正在进行时,另一件事必须等待。在我的例子中,如果触发了另一个事件,那么第一个事件中的剩余项目应该被放弃。这一逻辑正在落实到位。但是,这些价值观并没有影响到我们。可能是因为onAnimationUpdate异步调用。何时/何地调用
animateResizeWidth
?