Анимация слайдов при изменении процентного показателя

#android #android-layout #android-animation #android-constraintlayout

#Android #android-макет #android-анимация #android-constraintlayout

Вопрос:

У меня есть представление, которое выглядит следующим образом:

https://i.stack.imgur.com/zKe01.png

При нажатии я хочу анимировать серый цвет фона, чтобы он перемещался с правой стороны на 50% от его начальной ширины:

https://i.stack.imgur.com/s96BX.png

Вот соответствующая часть XML-макета:

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@ id/content_view"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:layout_marginBottom="4dp">

    <androidx.constraintlayout.widget.Guideline
        android:id="@ id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="1.0"/>

    <View
        android:id="@ id/background"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="@ id/guideline"
        android:background="@drawable/background" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

Я пробовал следующее:

 contentView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(contentView);
        constraintSet.setGuidelinePercent(guideline.getId(), 0.5f);

        TransitionManager.beginDelayedTransition(contentView);
        constraintSet.applyTo(contentView);
    }
});
 

Но вместо того, чтобы цвет фона перемещается справа налево (от 100% до 50%), он как бы просто исчезает.

Что я делаю не так? Как мне изменить свой код, чтобы анимация меняла цвет фона при изменении ориентира в процентах?

Ответ №1:

Вы можете использовать android.animation.ValueAnimator для изменения процентного значения вашего guideline внутри вашего constraintLayout , код будет выглядеть следующим образом:

 contentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // initialize your guideline
                // Guideline guideline = findViewById ....
                
                ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f, 0.5f);
                
                // set duration
                valueAnimator.setDuration(1000);
                // set interpolator and  updateListener to get the animated value
                valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
                
                // update guideline percent value through LayoutParams
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams) guideline.getLayoutParams();
                        // get the float value
                        lp.guidePercent = (Float) animation.getAnimatedValue();
                        // update layout params
                        guideline.setLayoutParams(lp);
                    }

                });
                valueAnimator.start();

            }
        });
 

Комментарии:

1. Это работает, но почему это не сработало ConstraintSet в моем вопросе?

2. Насколько я понимаю, вы не получаете анимацию скольжения, я попробовал ваш код, и он показывает анимацию скольжения (точно такую же, как в приведенном выше коде). Можете ли вы попробовать передать AutoTransition параметр объекта в свой beginDelayedTransition вызов, например: TransitionManager.beginDelayedTransition(contentView,AutoTransition())