Android 如何使用ValueAnimator制作平滑动画?
我想隐藏一个扩展晶圆厂时,它是点击使用动画。我想将按钮从原来的高度和宽度缩小到0/0。它消失在角落里,但是动画在中间是凹凸不平的。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
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