#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())