Как контролировать маржу с ключевым кадром? - PullRequest
4 голосов
/ 27 мая 2019

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

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <Transition

        app:constraintSetEnd="@+id/end"
        app:constraintSetStart="@+id/start"

        >
        <OnSwipe
            app:dragDirection="dragUp"
            app:touchAnchorId="@id/scrollable"
            app:touchAnchorSide="top" />
        <KeyFrameSet>
            <KeyAttribute
                app:curveFit="linear"
                app:framePosition="10"
                app:motionTarget="@+id/text">
                <CustomAttribute
                    app:attributeName="layoutMarginStart"
                    app:customDimension="68dip" />
            </KeyAttribute>
            <KeyAttribute
                app:curveFit="linear"
                app:framePosition="60"
                app:motionTarget="@+id/text">
                <CustomAttribute
                    app:attributeName="layoutMarginEnd"
                    app:customDimension="0dip" />
            </KeyAttribute>

        </KeyFrameSet>
        <ConstraintSet android:id="@+id/start">
            <Constraint
                android:id="@+id/text"
                android:layout_width="0dip"
                android:layout_height="40dip"
                android:layout_marginStart="16dip"

                android:layout_marginTop="24dip"
                android:layout_marginEnd="16dip"
                android:layout_marginBottom="12dip"
                android:background="#BEBEBE"
                app:layout_constraintEnd_toEndOf="@+id/parent"
                app:layout_constraintStart_toStartOf="@+id/parent"
                app:layout_constraintTop_toTopOf="parent" />


        </ConstraintSet>

        <ConstraintSet android:id="@+id/end">
            <Constraint
                android:id="@+id/text"
                android:layout_width="0dip"
                android:layout_height="40dip"
                android:layout_marginStart="60dip"
                android:layout_marginTop="24dip"
                android:layout_marginEnd="60dip"
                android:layout_marginBottom="12dip"
                android:background="#BEBEBE"
                app:layout_constraintEnd_toEndOf="@+id/parent"
                app:layout_constraintStart_toStartOf="@+id/parent"
                app:layout_constraintTop_toTopOf="parent" />


        </ConstraintSet>
    </Transition>

</MotionScene>

1 Ответ

0 голосов
/ 02 июня 2019

В вашем представлении нет метода setLayoutMarginStart или setLayoutMarginEnd. Параметр app:attributeName будет работать через отражение и искать эти методы.

Один из способов добиться этого - просто создать подкласс вашего View и написать свои собственные сеттеры.

fun setMarginTop(newMarginTop: Int) {
    val lp = layoutParams as? ViewGroup.MarginLayoutParams ?: return
    lp.run { 
        setMargins(leftMargin, newMarginTop, rightMargin, bottomMargin)
    }
    layoutParams = lp
}

Или, если вы используете kotlin-ktx:

fun setMarginTop(newMarginTop: Int) {
    updateLayoutParams<ViewGroup.MarginLayoutParams> {
        updateMargins(top = newMarginTop)
    }
}
...