ConstraintLayout约束线百分比动画

8

我对使用ConstraintLayout(Java)还比较新。

我想要实现的效果就像是当数字键盘以滑动动画的形式显示/隐藏时,我尝试过类似于以下代码:

Animation a = new Animation() {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        ConstraintLayout.LayoutParams lparams = (ConstraintLayout.LayoutParams) guideline.getLayoutParams();
        lparams.guidePercent = 0.5f;
        guideline.setLayoutParams(lparams);
    }
};
a.setDuration(3000);
a.setFillAfter(true);
guideline.startAnimation(a);

是的,指南(以及相应的视图)正在移动到屏幕中央,但它并没有像预期的那样流畅。有没有办法实现动画的流畅性?任何建议将不胜感激!

你试过建议的答案了吗? - Raghunandan
2个回答

12

你可以使用 ValueAnimator

Kotlin示例:

    val guideline = findViewById<View>(R.id.guideline2) as Guideline
    val end = (guideline.layoutParams as ConstraintLayout.LayoutParams).guidePercent
    // get end percent. start at 0
    val valueAnimator = ValueAnimator.ofFloat(0f, end)
    valueAnimator.duration = 3000
    // set duration 
    valueAnimator.interpolator = AccelerateDecelerateInterpolator()
    // set interpolator and  updateListener to get the animated value
    valueAnimator.addUpdateListener { valueAnimator ->
        val lp = guideline.layoutParams as ConstraintLayout.LayoutParams
        // get the float value
        lp.guidePercent = valueAnimator.animatedValue as Float
        // update layout params
        guideline.layoutParams = lp
    }
    valueAnimator.start()

Java版本

 final Guideline guideline = findViewById(R.id.guideline2) ;
 ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)guideline.getLayoutParams();
 float end =lp.guidePercent;
 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, end);
 valueAnimator.setDuration(3000);
 valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)guideline.getLayoutParams();
                lp.guidePercent = valueAnimator.getAnimatedFraction();
                guideline.setLayoutParams(lp);

            }
 });

将此转换为Java后,它对我起作用了。当我回到我的机器上时,会发布Java版本,以供未来需要的人使用。 - Lysdexia
当然会发布Java版本。 - Raghunandan
2
不要忘记调用 valueAnimator.start(); 如果你想在起始值和结束值之间进行动画,可以使用 (float)valueAnimator.getAnimatedValue(); - 9paradox
guideline.layoutParams已经被弃用了。我能使用什么其他东西? - Priyanka Chauhan
@PriyankaChauhan 使用 AndroidX Jetpack 中的 ConstraintLayout,它并未被弃用。 - Raghunandan

2
尝试使用ConstraintSet来对布局进行动画处理。请参阅使用Android ConstraintLayout实现美观的动画效果
引用一段话:“除了大多数人不知道的一个好处,而且官方文档也没有提到:使用很少的代码在ConstraintLayout视图上执行酷炫的动画。”
还有其他来源和一些关于这种技术的视频。我认为您会发现这是一个更加流畅的方式来完成您想要做的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接