Я сейчас делаю свои первые шаги в макете движения.
Пример, который я хочу создать, следующий:
Макет движения с двумя FAB (мини и обычный). На изображении выше показано конечное состояние после щелчка FAB обычного размера.
Что я пробовал:
Motion Layout (является частью другой файл макета):
<androidx.constraintlayout.motion.widget.MotionLayout
android:id="@+id/include"
app:motionDebug="SHOW_PATH"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@android:color/darker_gray"
android:layout_margin="8dp"
app:layoutDescription="@xml/menu_scene"
app:layout_constraintTop_toBottomOf="@id/text"
app:layout_constraintStart_toStartOf="@id/text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/images_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="@id/menu_button"
app:layout_constraintTop_toTopOf="@id/menu_button"
app:layout_constraintBottom_toBottomOf="@id/menu_button"
android:src="@drawable/ic_image"
app:fabSize="mini" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/menu_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/ic_edit" />
</androidx.constraintlayout.motion.widget.MotionLayout>
MotionScene:
<MotionScene xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<Transition
app:constraintSetStart="@+id/start"
app:constraintSetEnd="@+id/end">
<OnClick
app:targetId="@+id/menu_button"
app:clickAction="toggle" />
</Transition>
<!-- pulls constraints from layout -->
<ConstraintSet android:id="@+id/start" />
<ConstraintSet android:id="@+id/end">
<Constraint android:id="@id/images_button">
<Layout
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</Constraint>
</ConstraintSet>
</MotionScene>
Но, к сожалению, с этой конфигурацией я получил это:
Крошечная розовая точка в левом нижнем углу - это мини-FAB.
Поскольку я слышал о DerveConstraintsFrom , я дал ему шанс :
<MotionScene ...>
<Transition ...>
...
</Transition>
<ConstraintSet android:id="@+id/start" />
<ConstraintSet
android:id="@+id/end"
app:deriveConstraintsFrom="@id/start">
<Constraint android:id="@id/images_button">
...
</Constraint>
</ConstraintSet>
</MotionScene>
Но я получил тот же результат! : (
Единственный способ получить желаемый результат был со следующей конфигурацией набора ограничений:
<MotionScene ...>
...
<ConstraintSet android:id="@+id/start" />
<ConstraintSet android:id="@+id/end">
<Constraint android:id="@id/images_button">
<!-- duplicated the layout properties from the initial layout :( -->
<Layout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/menu_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</Constraint>
</ConstraintSet>
</MotionScene>
Заключение:
Я думал, что пустой набор ограничений <ConstraintSet android:id="@+id/start" />
извлекает свои ограничения из самого макета, а app:deriveConstraintsFrom="@id/start"
в другом наборе ограничений определяет все ограничения из начального набора ограничений и перезаписывает свои собственные.
Может кто-нибудь сказать мне почему это не работает? Или я что-то пропустил?
Спасибо, Крис
PS .: Я использую androidx.constraintlayout:constraintlayout:2.0.0-beta4