MotionLayout несколько переходов - PullRequest
1 голос
/ 04 октября 2019

Прежде всего, я использую 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();
}

Однако после этого фрагмента прокрутка перестает работать. Я подозреваю, что это было отключено, но я не могу найти, как вернуть это, как это было прежде. Отсутствие документации также не помогает.

Заранее спасибо!

...