Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ValueAnimator中的Android宽度动画冲突_Android_Animation_Android Animation - Fatal编程技术网

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