MotionLayout котлин как сбросить сцену и видимость?

#android #kotlin #android-motionscene

Вопрос:

У меня есть приложение для карточек, и у меня есть сцена с перевернутой картой. Я работаю с видимостью элементов, и мне также нужна сцена движения там. У меня проблема, как сбросить движение и установить желаемую видимость элементов? Моя сцена отлично работает после первого щелчка. Тогда я не могу сбросить сцену, и код не реагирует на изменение видимости. Как это исправить?

Фрагмент:

 viewModel.sidedCard.observe(viewLifecycleOwner) { sidedCard ->

        when {
            sidedCard == null -> {
                binding.textView.text = "End of Game!"
                binding.brnDontKnow.isVisible = false
                binding.btnKnow.isVisible = false
                binding.btnCheck.isVisible = false
                binding.btnEndOfGameBack.isVisible = true
                viewModel.endOfGame()
            }
            sidedCard.side == 0 -> {
                binding.textView.text = sidedCard.card.titles[0]
                binding.brnDontKnow.isVisible = false
                binding.btnKnow.isVisible = false
                binding.btnCheck.isVisible = true

            }
            else -> {
                binding.textView2.text = sidedCard.card.titles[1]
                binding.brnDontKnow.isVisible = true
                binding.btnKnow.isVisible = true
                binding.btnCheck.isVisible = false            
            }
        }
    }

    binding.brnDontKnow.setOnClickListener {
        viewModel.markCardAsDontKnow()
    }

    binding.btnKnow.setOnClickListener {
        viewModel.markCardAsKnow()
    }

    binding.btnCheck.setOnClickListener {
        viewModel.changeSide()
        binding.motionLayoutCard.transitionToStart()
        binding.motionLayoutCard.transitionToEnd()
        binding.motionLayoutCard.rebuildScene()

    }
}
 

И вот моя сцена :

 <?xml version="1.0" encoding="utf-8"?>
 
 <Transition
    app:constraintSetEnd="@ id/end"
    app:constraintSetStart="@ id/start"
    motion:duration="5000">
    <KeyFrameSet>

        <KeyAttribute
            app:framePosition="1"
            app:motionTarget="@ id/textView"
            android:alpha="1.0"/>
        <KeyAttribute
            app:framePosition="50"
            app:motionTarget="@ id/textView"
            android:alpha="0.5"/>

        <KeyAttribute
            app:framePosition="0"
            app:motionTarget="@ id/textView2"
            android:alpha="0"/>
        <KeyAttribute
            app:framePosition="50"
            app:motionTarget="@ id/textView2"
            android:alpha="0.5"/>
    </KeyFrameSet>
</Transition>

<ConstraintSet android:id="@ id/start">
    <Constraint android:id="@id/btnCheck">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@id/btnEndOfGameBack">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@id/btnKnow">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@id/brnDontKnow">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>

</ConstraintSet>


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

    <Constraint android:id="@id/btnCheck">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@id/btnEndOfGameBack">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@id/btnKnow">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@id/brnDontKnow">
        <PropertySet
            app:applyMotionScene="false"
            app:visibilityMode="ignore" />
    </Constraint>
    <Constraint android:id="@ id/textView"
        android:alpha="0"
        android:rotationY="180"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"

        />
    <Constraint android:id="@ id/textView2"
        android:alpha="1"
        android:rotationY="0"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"

        />
    <Constraint android:id="@ id/textViewContainer"
        android:rotationY="180"
        android:layout_width="300dp"
        android:layout_height="300dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
</ConstraintSet>
 

Комментарии:

1. Совершенно неясно, в чем проблема. В идеале вы переходите в нужное состояние в конце (начале). Для наглядности, если вы контролируете его, установите его на то, что вы хотите. Что не работает?

Ответ №1:

Для представлений, которые вы хотите изменить их видимость за пределами constraintSet s, вы должны добавить motion:visibilityMode="ignore" в scene файл yout.

Что-то вроде:

         <Constraint
        android:id="@id/btn_dont_know"
        ...
        motion:visibilityMode="ignore" />