Android平滑宽度变化动画

Posted

技术标签:

【中文标题】Android平滑宽度变化动画【英文标题】:Android smooth width change animation 【发布时间】:2013-08-20 13:18:33 【问题描述】:

有人知道如何在 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();
        
    

【问题讨论】:

ObjectAnimator(ValueAnimator)相当流畅。你能展示一些关于你如何使用它们的示例吗?另外,您处于什么操作系统级别? 我已编辑帖子了解更多详情 【参考方案1】:

您可以使用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() 方法以获得更多便利。

【讨论】:

以上是关于Android平滑宽度变化动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌地图android中显示当前位置的平滑移动

Android:Horizo​​ntalScrollView smoothScroll 动画时间

Android动画下拉/向上视图正确

android从左到右平滑地改变图像的颜色

Android:如何确保软键盘平滑向上滑动

为 Shape 的笔画宽度设置动画