Используйте элементы линейной компоновки в компоновке движения

#android #android-animation #android-linearlayout #android-motionlayout

Вопрос:

Я хочу использовать linearlayout в motionlayout, но у меня проблема. Когда я хочу придать анимацию элементам linearlayout , я не могу дать никакой анимации элементам, которые находятся в linearlayout, и я могу просто придать анимацию linearlayout. Это основной xml — файл:

  <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/motion_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/activity_main_scene"
    tools:context=".MainActivity"
    tools:showpath="true" >

    <LinearLayout
        android:id="@ id/linearLayout5"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <Button
            android:id="@ id/button16"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:text="onClick" />

        <Button
            android:id="@ id/button17"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:text="onClick" />

        <Button
            android:id="@ id/button18"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:text="onClick" />
    </LinearLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
 

а это файл описания компоновки :

 <?xml version="1.0" encoding="utf-8"?>
<MotionScene 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetEnd="@ id/end"
        motion:constraintSetStart="@id/start"
        motion:duration="1000">
       <KeyFrameSet>

       </KeyFrameSet>
    </Transition>

    <ConstraintSet android:id="@ id/start" >
        <Constraint
            motion:layout_constraintEnd_toEndOf="parent"
            android:id="@ id/linearLayout4" />
    </ConstraintSet>

    <ConstraintSet android:id="@ id/end">
    </ConstraintSet>
</MotionScene>
 

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

1. Макет движения может анимировать только своих прямых потомков. Если вы хотите запустить какую-либо анимацию на своих кнопках, вам нужно будет выровнять иерархию представлений, то есть удалить линейную компоновку, и поместить их непосредственно в макет движения.

2. Я просто хочу добавить следующее: не используйте DP напрямую, используйте ресурсы dimen

3. Зачем вам нужно использовать LinearLayout ?

4. Потому что я хочу сделать анимационный логотип с представлениями, которые они в моей линейке и кнопках в моем коде являются примером. @Ной

5. Вы пробовали заменить LinearLayout другим MotionLayout? Тогда вам понадобятся два файла сцен, но это должно быть возможно.

Ответ №1:

В группе просмотра (например, MotionLayout) нельзя управлять представлениями другой группы просмотра. В вашем случае линейный вывод определяет положение его представлений. (Это его работа)

У вас есть несколько решений:

  1. Вложенные списки перемещений
  2. Поток
  3. Создавайте наборы ограничений, которые ведут себя так же, как и LinearLayout

Вложенные списки перемещений

Вам понадобится два файла MotionScene. Пусть прогресс одного влияет на прогресс другого. (Добавьте в набор ограничений <ConstraintOverrid android:id:="child" motion:motionProgress="0 or 1" >

Поток

Поток позволяет сгладить иерархию, но добиться поведения, такого как линейная компоновка.Об этом есть много статей. Наиболее подходящим для вас является «Поток с ограничениями, Прощай, линейный вывод», поскольку в MotionLayout реализованы все функции ConstraintLayout, так что это сработает.

Примечание. Чтобы сохранить разделение и повторное использование (если это была цель, вы можете поместить представления в отдельный раздел.

Эмуляция линейного отображения с ограничениями

Это самое легкое. Создайте вертикальную цепочку и ограничьте начало и конец родительским элементом. (Большинство введений в ConstraintLayout описывают это.