我对AnimatorSet
playTogether
或ObjectAnimator
内部对话(DialogFragment
/ AlertDialog
)的效果进行了多次测试(点击/手动测试)并进行了比较活动或片段中裸露的充气布局中AnimatorSet
的速度。我在对话框中做动画的结论(无论是DialogFragment
还是AlertDialog
)是否很慢并且有故障。
任何人都可以证实吗?
要重现此问题,请首先创建一个简单的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/view1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:id="@+id/view2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>
我们可以用CustomView
或ImageView
替换View(view1,view2),或者添加一些布局约束来重新定位视图。我们也可以将ConstraintLayout
替换为LinearLayout
,RelativeLayout
等。上面的代码只是一个说明目的。
在Activity
或DialogFragment
内,使用ObjectAnimator
和AnimatorSet
动画显示所有观看次数:
// find view1 and view2 and declare as variable value
// ....
val listOfView = listOf(view1, view2)
val animSet = AnimatorSet()
val animators = listOfView.map {
val animator = ObjectAnimator.ofFloat(it, "rotation", 0f, 360f)
animator.duration = 1000
animator.repeatCount = ObjectAnimator.INFINITE
animator.repeatMode = ObjectAnimator.RESTART
animator.interpolator = LinearInterpolator()
animator
}
animSet.playTogether(animators)
animSet.start()
我在这里使用kotlin,因为Android现在正式支持kotlin。
我们将观察到DialogFragment
内的动画有毛刺,但活动/片段中的动画优于并且速度快。将持续时间增加到极限水平(如500或200),Dialog
内的毛刺看起来会更加微妙。
有人能证实这个问题吗?那背后有什么解释和原因?如果有办法在对话框中增加动画的性能,如何实现呢?。