Программное изменение атрибута ConstraintSet в анимированной сцене MotionLayout

У меня есть вариант использования, когда я хочу создать анимацию, похожую на Youtube, с помощью MotionLayout. В репозитории this есть образец этой анимации. Но проблема в том, что в этом примере они используют статическую высоту для начального ограничения, такого как 320dp:

<MotionScene...>

    <Transition..>

        <OnSwipe... />

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

            <Constraint
                android:id="@id/top_image_container"
                android:layout_width="0dp"
                android:layout_height="320dp"
                motion:layout_constraintTop_toTopOf="parent"
                motion:layout_constraintStart_toStartOf="parent"
                motion:layout_constraintEnd_toEndOf="parent"  />

      </ConstraintSet>
  </Transition>
</MotionScene>

Но мое требование установить ограничение с использованием соотношения сторон. Для статического соотношения сторон я могу установить, используя app:layout_constraintDimensionRatio="w,16:9" в Constraint, как это.

<Constraint
    android:id="@id/top_image_container"
    android:layout_width="0dp"
    android:layout_height="0dp"
    motion:layout_constraintTop_toTopOf="w,16:9"
    motion:layout_constraintTop_toTopOf="parent"
    motion:layout_constraintStart_toStartOf="parent"
    motion:layout_constraintEnd_toEndOf="parent"  />

Но каждое видео имеет разное соотношение сторон, которое я получаю от API, поэтому я хочу установить другое соотношение сторон в зависимости от видео. Я не могу найти способ установить это программно в ConstraintSet

Я попробовал обходной путь, чтобы установить android:layout_height="wrap_content" и программно изменить соотношение сторон экрана. Но это не сработало, и анимация не работала должным образом.

Любое решение или предложение будут оценены.


person Burhanuddin Rashid    schedule 26.02.2019    source источник


Ответы (1)


Что вы можете сделать, так это получить доступ к ConstraintSet и затем установить соотношение:

motionLayout.getConstraintSet(R.id.start)?.let { startConstraintSet ->
    val ratio = imageView.calculateRatio()
    startConstraintSet.setDimensionRatio(R.id.top_image_container, ratio)
    // You can set the width and height here as well
}
person jossiwolf    schedule 26.02.2019
comment
Здравствуйте, это сработает автоматически или мне нужно где-то запускать? Потому что я изменил высоту представления, используя constraintHeight () перед startPostponedEnterTransition (). Но на новой высоте он все еще не применен. Я пытаюсь установить высоту, чтобы создать эффект параллакса во время прокрутки. - person Sasi Kanth; 28.04.2019
comment
Это дает вам изменяемый ConstraintSet, который, AFAIK, вам все равно придется установить программно. - person jossiwolf; 25.12.2019
comment
как изменить высоту например ?! - person AHméd Net; 13.06.2021