使用View.animate()在RecyclerView中为itemView添加动画效果

时间:2017-12-11 12:50:58

标签: android animation android-recyclerview android-animation objectanimator

我有一个有文字的适配器。 CountDownTimer用于每1秒向适配器添加数据,并且notifyItemInserted。当onBindViewHolder时,运行以下代码:

sampleItemView.setText(text)
        val animatorY = ObjectAnimator.ofFloat(sampleItemView, "translationY", 1000f, 1f)
        val animatorX = ObjectAnimator.ofFloat(sampleItemView, "translationX", 1000f, 1f)
        val set = AnimatorSet()
        set.playTogether(animatorX, animatorY)
        set.duration = 2000
        set.start()

动画已成功执行。 但是当我改为

sampleItemView.animate()
                    .setInterpolator(LinearInterpolator())
                    .translationXBy(1000f)
                    .translationYBy(1000f)
                    .setDuration(2000)
                    .setUpdateListener({
                        println("x($text): ${sampleItemView.x}")
                        println("y($text): ${sampleItemView.y}")
                    })
                    .start()

无法运行动画。上面两段代码有什么区别?

1 个答案:

答案 0 :(得分:0)

  

上述两段代码有什么不同?

从概念上讲,它们看起来非常相像。然而,存在着微妙的差异。

以下声明:

ObjectAnimator.ofFloat(sampleItemView, "translationY", 1000f, 1f)

你告诉:“动画translationY属性从值1000到1”。

另一方面,以下声明:

translationYBy(1000f)

您告诉我:“将当前值设置为{{1>}属性当前+ 1000 ”。

因此,他们相等。

此动画将等于初始动画:

translationY

请注意, view.animate() .withStartAction(() -> { view.setTranslationX(1000); view.setTranslationY(1000); }) .translationX(1) .translationY(1) ... 代替translationY()