#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) нельзя управлять представлениями другой группы просмотра. В вашем случае линейный вывод определяет положение его представлений. (Это его работа)
У вас есть несколько решений:
- Вложенные списки перемещений
- Поток
- Создавайте наборы ограничений, которые ведут себя так же, как и LinearLayout
Вложенные списки перемещений
Вам понадобится два файла MotionScene. Пусть прогресс одного влияет на прогресс другого. (Добавьте в набор ограничений <ConstraintOverrid android:id:="child" motion:motionProgress="0 or 1" >
Поток
Поток позволяет сгладить иерархию, но добиться поведения, такого как линейная компоновка.Об этом есть много статей. Наиболее подходящим для вас является «Поток с ограничениями, Прощай, линейный вывод», поскольку в MotionLayout реализованы все функции ConstraintLayout, так что это сработает.
Примечание. Чтобы сохранить разделение и повторное использование (если это была цель, вы можете поместить представления в отдельный раздел.
Эмуляция линейного отображения с ограничениями
Это самое легкое. Создайте вертикальную цепочку и ограничьте начало и конец родительским элементом. (Большинство введений в ConstraintLayout описывают это.