Прежде всего, я использую androidx.constraintlayout: constraintlayout: 2.0.0-beta1, так как бета2 испортила множество макетов в нашем приложении.
Я пытался заставить MotionLayout играть двумя разнымипереходы при разных обстоятельствах:
1) При нажатии на определенный элемент я хочу сделать его развернутым и свернутым;2) При прокрутке идея заключалась в том, чтобы сделать еще один элемент для свертывания и расширения (аналогично сворачивающейся панели инструментов).
После некоторых исследований я обнаружил, что MotionLayout не будет принимать более одного тега переходавнутри его layoutDescription (он загрузит только первый найденный файл). Итак, чтобы моя реализация работала, я сделал это следующим образом:
Внутри MotionScene у меня есть только прокручиваемый элемент Transition с обоими его ConstraintSets. Я также определяю необходимые ConstraintSets для анимации щелчков.
<Transition
android:id="@+id/scroll_transition"
app:constraintSetStart="@id/notifications_expanded"
app:constraintSetEnd="@id/notifications_collapsed">
<OnSwipe
app:dragDirection="dragUp"
app:touchAnchorId="@id/swiperefresh_layout"
app:touchAnchorSide="top"
app:moveWhenScrollAtTop="true"/>
</Transition>
<ConstraintSet android:id="@+id/notifications_expanded">
<Constraint android:id="@id/notifications"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/header_info_container"
app:layout_constraintEnd_toEndOf="parent"/>
</ConstraintSet>
<ConstraintSet android:id="@+id/notifications_collapsed">
<Constraint android:id="@id/notifications"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="@id/header_info_container"
app:layout_constraintEnd_toEndOf="parent"/>
</ConstraintSet>
<ConstraintSet android:id="@+id/header_collapsed">
<Constraint android:id="@id/header_info_container"
android:visibility="gone"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/header_layout"
app:layout_constraintEnd_toEndOf="parent"/>
</ConstraintSet>
<ConstraintSet android:id="@+id/header_expanded">
<Constraint android:id="@id/header_info_container"
android:visibility="visible"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/header_layout"
app:layout_constraintEnd_toEndOf="parent"/>
</ConstraintSet>
В xml моего макета я устанавливаю layoutDescription;
<androidx.constraintlayout.motion.widget.MotionLayout
android:id="@+id/motion_layout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/transitions">
Переход с прокруткой работает, как и ожидалось, безупречно. Чтобы анимация щелчка действительно работала, я вызываю ее вручную:
if (headerInfoContainer.getVisibility() == View.VISIBLE) {
motionLayout.setTransition(R.id.header_expanded, R.id.header_collapsed);
motionLayout.setTransitionDuration(300);
motionLayout.transitionToEnd();
} else {
motionLayout.setTransition(R.id.header_collapsed, R.id.header_expanded);
motionLayout.setTransitionDuration(300);
motionLayout.transitionToEnd();
}
Однако после этого фрагмента прокрутка перестает работать. Я подозреваю, что это было отключено, но я не могу найти, как вернуть это, как это было прежде. Отсутствие документации также не помогает.
Заранее спасибо!