Android 如何使用ValueAnimator制作平滑动画?

Android 如何使用ValueAnimator制作平滑动画?,android,animation,material-design,Android,Animation,Material Design,我想隐藏一个扩展晶圆厂时,它是点击使用动画。我想将按钮从原来的高度和宽度缩小到0/0。它消失在角落里,但是动画在中间是凹凸不平的。 private fun animateHideScoreFab(){ val animX = ValueAnimator.ofInt(editScoreFab.measuredWidth, 0).apply { duration = 1000 } val animY = ValueAni

我想隐藏一个扩展晶圆厂时,它是点击使用动画。我想将按钮从原来的高度和宽度缩小到0/0。它消失在角落里,但是动画在中间是凹凸不平的。
    private fun animateHideScoreFab(){
        val animX = ValueAnimator.ofInt(editScoreFab.measuredWidth, 0).apply {
            duration = 1000
        }
        val animY = ValueAnimator.ofInt(editScoreFab.measuredHeight, 0).apply {
            duration = 1000
        }


        animX.addUpdateListener {
            val value = it.animatedValue as Int
            editScoreFab.layoutParams.width = value
            editScoreFab.requestLayout()
        }

        animY.addUpdateListener {
            val value = it.animatedValue as Int
            editScoreFab.layoutParams.height = value
        }

        AnimatorSet().apply {
            this.interpolator = AccelerateDecelerateInterpolator()
            play(animX).with(animY)
            start()
        }

    }
结果:


使用
加速加速插值器

一种插值器,其中变化率开始和结束缓慢,但通过中间加速

因此,在中间,变化率比开始的速度快,这可能使它看起来更差。 尝试另一种插值器,如线性插值器,它具有恒定的变化率

更新 对于AcceleratedAccelerateInterpolator,如果您在400ms和600ms之间查看表格,该值将跳跃您所需距离的45.5%并设置动画

平滑度的另一个因素不是使用Int,而是使用Float,例如
ValueAnimator.offload
,因此它有中间步骤

更新2

重新布置一个项目是昂贵的,因为它必须被测量和重新绘制

仅仅缩放已经绘制的图像应该更快、更平滑,因为这通常是由GPU完成的,因此速度更快、更平滑。缩放视图时也会使用
浮点值

将Fab缩放到右上角的示例单击
onClick
(注意使用
ObjectAnimator
,因为它更易于实现)

抱歉在Java中不是Kotlin

FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
AnimatorSet animationSet=新的AnimatorSet();
//将点设置为围绕右上角缩放
view.setPivotY(0);
view.setPivotX(view.getMeasuredWidth());
ObjectAnimator scaleY=ObjectAnimator.offload(视图,“scaleY”,1f,0f);
scaleY.setDuration(1000);
//可选,因为默认设置为AccelerateDelateInterpolator
setInterpolator(新的AcceleratedAccelerateInterpolator());
ObjectAnimator scaleX=ObjectAnimator.offload(视图,“scaleX”,1f,0f);
scaleX.setDuration(1000);
//可选,因为默认设置为AccelerateDelateInterpolator
setInterpolator(新的AcceleratedAccelerateInterpolator());
animationSet.playTogether(scaleX、scaleY);
animationSet.start();
}
});

使用
加速加速插值器

一种插值器,其中变化率开始和结束缓慢,但通过中间加速

因此,在中间,变化率比开始的速度快,这可能使它看起来更差。 尝试另一种插值器,如线性插值器,它具有恒定的变化率

更新 对于AcceleratedAccelerateInterpolator,如果您在400ms和600ms之间查看表格,该值将跳跃您所需距离的45.5%并设置动画

平滑度的另一个因素不是使用Int,而是使用Float,例如
ValueAnimator.offload
,因此它有中间步骤

更新2

重新布置一个项目是昂贵的,因为它必须被测量和重新绘制

仅仅缩放已经绘制的图像应该更快、更平滑,因为这通常是由GPU完成的,因此速度更快、更平滑。缩放视图时也会使用
浮点值

将Fab缩放到右上角的示例单击
onClick
(注意使用
ObjectAnimator
,因为它更易于实现)

抱歉在Java中不是Kotlin

FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
AnimatorSet animationSet=新的AnimatorSet();
//将点设置为围绕右上角缩放
view.setPivotY(0);
view.setPivotX(view.getMeasuredWidth());
ObjectAnimator scaleY=ObjectAnimator.offload(视图,“scaleY”,1f,0f);
scaleY.setDuration(1000);
//可选,因为默认设置为AccelerateDelateInterpolator
setInterpolator(新的AcceleratedAccelerateInterpolator());
ObjectAnimator scaleX=ObjectAnimator.offload(视图,“scaleX”,1f,0f);
scaleX.setDuration(1000);
//可选,因为默认设置为AccelerateDelateInterpolator
setInterpolator(新的AcceleratedAccelerateInterpolator());
animationSet.playTogether(scaleX、scaleY);
animationSet.start();
}
});

视图中有一个
scaleX
scaleY
属性,可以从1插值到0,这将产生视图收缩的效果,而不是容器

其次,如果父布局参数不适合您,则要将动画工作缩放到顶部,必须使用以下命令将轴设置到rightXtop角:
view.pivotX=view.width;view.pivotY=0


此外,如果您使用<代码> PristyListabor < /Cl>并更新它,您只能使用一个ValueMealAdvor,然后自己做CALC,考虑替换<代码> EddioSeaFiab.RealestLayOut.()/<代码> <代码> EddioSeaBeab.ValueDATE()。

视图中有一个
scaleX
scaleY
属性,可以从1插值到0,这将产生视图收缩的效果,而不是容器

其次,如果父布局参数不适合您,则要将动画工作缩放到顶部,必须使用以下命令将轴设置到rightXtop角:
view.pivotX=view.width;view.pivotY=0

此外,如果您使用
propertyListener
并自己更新它,您可以使用onl