【问题标题】:How do you animate a change in a view's padding?您如何为视图填充的变化设置动画?
【发布时间】:2013-08-24 15:00:11
【问题描述】:

我想对视图填充的变化进行动画处理。翻译动画的放置位置与我要应用的填充相同。

TranslateAnimation moveleft = new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
                    Animation.ABSOLUTE, PADDING, Animation.ABSOLUTE,
                    0.0f, Animation.ABSOLUTE, 0.0f);

moveLeft.setDuration(500);
moveLeft.setFillAfter(true);

这会启动视图的动画,然后设置填充。这并不完全有效,因为它会导致图形故障。

v.startAnimation(moveleft);   
v.setPadding(PADDING, 0, 0,0);

【问题讨论】:

    标签: android animation view viewgroup


    【解决方案1】:

    使用ValueAnimator,它非常简单整洁

    说, 我们必须将右侧填充更改为 _20dp,其中左侧、顶部和底部填充分别为 _6dp、_6dp 和 0。

    ofInt() 是可变参数类型。我们必须设置动画的值是作为 KeyValue 对传入的(arg1 = 当前值,arg2 = 目标值,............)

    我们来了,

    ValueAnimator animator = ValueAnimator.ofInt(view.getPaddingRight(), _20dp);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator){
            view.setPadding(_6dp, _6dp, (Integer) valueAnimator.getAnimatedValue(), 0);
        }
    });
    animator.setDuration(200);
    animator.start();
    

    【讨论】:

      【解决方案2】:

      与其立即设置填充,不如尝试在动画完成后使用动画侦听器设置填充?

      v.setAnimationListener(new Animation.AnimationListener() {
          ...
          @Override
          public void onAnimationEnd(){
              v.setPadding(PADDING, 0, 0,0);
          }
          ...
      });
      v.startAnimation(moveleft);
      

      【讨论】:

      • 我之前尝试过这个实现,但结果仍然是类似的图形故障。但是,我找到了解决它的方法。在设置填充之前,我在动画视图上调用了.clearAnimation()。我假设.onAnimationEnd() 中的代码在动画结束后运行。好像不是这样的。
      • 另外我删除了.setFillAfter()
      【解决方案3】:

      以下是如何在 Kotlin 中为 setPadding 设置动画:

      private fun setPaddingWithAnimation() {
      
          val paddingDp: Int = 20
      
          val density: Float = requireActivity().getResources().getDisplayMetrics().density
      
          val paddingPixel: Int = (paddingDp * density).toInt()
      
          val animator = ValueAnimator.ofInt(recyclerItems.paddingRight, paddingPixel)
      
          animator.addUpdateListener { valueAnimator -> binding.recyclerHealthTips.recyclerHealthTips.setPadding(
                      paddingPixel, 0, valueAnimator.animatedValue as Int, 0) }
              
          animator.duration = 500
          animator.start()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 2012-08-15
        相关资源
        最近更新 更多