0

有人知道如何在 Android 上实现平滑的宽度变化动画吗?我已经检查了几个使用自定义动画类或 ValueAnimator+AnimatorUpdateListener 的示例 - 但它们的工作并不顺利,尤其是在同时处理多个附加动画时。

有任何想法吗?谢谢

我正在使用下一个代码对列表中的项目进行动画处理(即使 4 个项目也不流畅),有时它们也会发生动画,并从上到下平移视图 - 而且它也不流畅(但如果翻译动画工作没有列表项宽度变化 - 它很平滑):

        public void showDragHold() {
            isOnDrag = true;
            int width = -1;
            int duration = 0;
            LinkedList<Animator> valueAnimators = new LinkedList<Animator>();
            for (View view : views) {
                View dragView = view.findViewById(R.id.list_handle_drag);
                if (width < 0) {
                    width = dragView.getResources().getDimensionPixelSize(R.dimen.drag_width);
                    duration = dragView.getResources().getInteger(R.integer.anim_fast_duration);
                }
                ValueAnimator valueAnimator = ValueAnimator.ofInt(0, width);
                valueAnimator.addUpdateListener(new ResizeUpdateAnimator(dragView));
                valueAnimators.add(valueAnimator);
            }
            if (!valueAnimators.isEmpty()) {
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.playTogether(valueAnimators);
                animatorSet.setDuration(duration);
                animatorSet.start();
            }
        }

    private static final class ResizeUpdateAnimator implements ValueAnimator.AnimatorUpdateListener {
        private View view;

        public ResizeUpdateAnimator(View view) {
            this.view = view;
        }

        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            final int newWidth = (Integer) valueAnimator.getAnimatedValue();
            view.getLayoutParams().width = newWidth;
            view.requestLayout();
        }
    }
4

1 回答 1

0

您可以使用droidQuery更方便地使用ValueAnimators 进行动画处理。您还可以一次为多个值设置动画,包括LayoutParam属性。例如:

$.with(dragView).animate(/* CSS-Style animation attributes*/"{ width : " + width + " }", 
                         /* duration (ms) */400,
                         /* Easing */$.Easing.LINEAR,
                         /* on Complete */$.noop());

您可以向 CSS 字符串添加其他属性,它们都将作为集合的一部分进行动画处理。CSS 修饰符,例如 px、em 等,也可以使用。最后,查看其他 animate() 方法以获得更多便利。

于 2013-08-20T14:00:03.470 回答