fitsSystemWindows прерывает переход MotionLayout - PullRequest
0 голосов
/ 27 января 2019

У меня есть переход MotionLayout, связанный с ViewPager.

private val pageChangedListener = object : SimpleOnPageChangeListener() {
    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        super.onPageScrolled(position, positionOffset, positionOffsetPixels)
        motionLayout.progress = (position + positionOffset) / (pager.adapter!!.count - 1)
    }
}

Все отлично работает, кроме fitsSystemWindows, которая, при добавлении в MotionLayout, нарушает анимацию.Весь макет прыгает в начале анимации и в конце.Похоже, что заполнение добавляется дважды, когда motionLayout не точно равен 0 или 1. Я подготовил два видео с fitsSystemWindows, установленными в true и false, чтобы лучше визуализировать проблему.

Обратите внимание, что макет навидео упрощено, переход явно намного сложнее, но этого достаточно, чтобы увидеть разницу.Также я использую constraintlayout:2.0.0-alpha3.

fitsSystemWindows="true" -> https://imgur.com/a/SlHH1NJ - анимацию прыжков в начале и в конце.

fitsSystemWindows="false" -> https://imgur.com/a/WwkfyoM -без прыжков, но нижняя кнопка не подходит к окну системы.

Есть идеи, как исправить переход?


Мой макет:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_width="match_parent"
android:layout_height="match_parent">

...

<androidx.constraintlayout.motion.widget.MotionLayout
    android:id="@+id/motionLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    app:layoutDescription="@xml/motion_scene">

    <TextView
        android:id="@+id/titleTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-thin"
        android:gravity="center"
        android:text="..."
        android:textSize="52sp" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/pager"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:visibility="gone" />

    <LinearLayout
        android:id="@+id/timerLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        ...

    </LinearLayout>

    <Button
        android:id="@+id/stopBtn"
        style="?attr/borderlessButtonStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:layout_margin="28dp"
        android:drawableTop="@drawable/ic_close"
        android:drawablePadding="12dp"
        android:letterSpacing=".1"
        android:text="..."
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.motion.widget.MotionLayout>

</FrameLayout>

MotionScene xml:

<?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"
xmlns:tools="http://schemas.android.com/tools">

<Transition
    motion:constraintSetEnd="@+id/end"
    motion:constraintSetStart="@+id/start"
    motion:duration="250"
    motion:interpolator="linear">

    <ConstraintSet android:id="@+id/start">

        <Constraint
            android:id="@+id/titleTv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="0dp"
            android:alpha="1"
            android:scaleX="1"
            android:scaleY="1"
            motion:layout_constraintBottom_toTopOf="@+id/timerLayout"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent" />

        <Constraint
            android:id="@+id/timerLayout"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="0dp"
            android:scaleX="1"
            android:scaleY="1"
            motion:layout_constraintBottom_toBottomOf="parent"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintTop_toTopOf="parent" />

    </ConstraintSet>

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

        <Constraint
            android:id="@+id/titleTv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:alpha="0"
            android:scaleX="0.6"
            android:scaleY="0.6"
            motion:layout_constraintBottom_toTopOf="@+id/timerLayout"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            tools:alpha="0.5" />

        <Constraint
            android:id="@+id/timerLayout"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="430dp"
            android:scaleX="0.7"
            android:scaleY="0.7"
            motion:layout_constraintBottom_toBottomOf="parent"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintTop_toTopOf="parent" />

    </ConstraintSet>

</Transition>

</MotionScene>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...