Как запустить конкретный переход в MotionLayout? - PullRequest
6 голосов
/ 16 июня 2020

У меня есть MotionScene с 4 ConstraintSets, представляющими 4 состояния экрана (состояния загрузки) и с 3 переходами между ними. Когда состояние моего приложения изменяется, например, с загрузки на обработку, я хочу запустить Переход 1 (set1 -> set2), когда состояние снова изменится, я хочу запустить Переход 2 (set2 -> set3). И я не могу найти способ сделать это.

Я попробовал следующее:

Чтобы установить текущий переход с помощью

     motion_layout.setTransition(R.id.set1, R.id.set2)
     motion_layout.transitionToState(R.id.set2)

Просто установить переход

motion_layout.setTransition(R.id.set1)

Для перехода в какое-либо состояние:

motion_layout.transitionToState(R.id.set1)

но все вышеперечисленные методы запускают все мои наборы вместе, даже если я использую app: autoTransition = "none".


Я попытался поместить все в один переход и установить app: progress = 0 on, а затем управлять состоянием анимации с прогрессом:

 motion_layout.setProgress(0.25f, 1.0f)

, который просто запускает всю анимацию до конец, или я попробовал

motion_layout.progress = 0.25f

, которые не анимируются, они просто показывают мне 0,25 хода анимации без движения.

Как управлять потоком анимации? Как запустить конкретный набор? Было бы лучше использовать прогресс? Как решить?

PS Использую

implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta7'

Ответы [ 3 ]

2 голосов
/ 28 июня 2020

Я не уверен, что вы делаете (недостаточно кода), но вот настолько простой, насколько я могу сделать его пример с 5 состояниями. *

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout 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"
app:layoutDescription="@xml/activity_main_scene"
android:id="@+id/motionlayout"
tools:context=".MainActivity">

<TextView
    android:id="@+id/view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#4DD3D3"
    android:text="Hello World!"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="transition"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    android:onClick="nextState"
    />
 </androidx.constraintlayout.motion.widget.MotionLayout>

и этот MainActivity.kt

package com.example.multistate

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}

fun nextState(view: View) {
   when (motionlayout.currentState ) {
       R.id.state1 -> motionlayout.transitionToState(R.id.state2)
       R.id.state2 -> motionlayout.transitionToState(R.id.state3)
       R.id.state3 -> motionlayout.transitionToState(R.id.state4)
       R.id.state4 -> motionlayout.transitionToState(R.id.state5)
       R.id.state5 -> motionlayout.transitionToState(R.id.state1)
   }
}
}
1 голос
/ 17 июня 2020

Если у вас нет, он должен переходить в состояние, которое вы вызываете, только если вы вызываете ml.transitionToState (R.id.xx);

Удалите все атрибуты autoTransition в вашем motionScene

0 голосов
/ 16 июня 2020

может попробовать что-то вроде этого:

motion_layout.setTransitionListener(
    object : MotionLayout.TransitionListener {
        override fun onTransitionChange(p0: MotionLayout?, p1: Int, p2: Int, p3: Float) {
        }

        override fun onTransitionCompleted(motionLayout: MotionLayout?, currentId: Int) {
            when(currentId) {
                R.id.set1 -> motion_layout.setTransition(currentId, R.id.set2)
                R.id.set2 -> motion_layout.setTransition(currentId, R.id.set3)
                R.id.set3 -> motion_layout.setTransition(currentId, R.id.set4)
                R.id.set4 -> motion_layout.setTransition(currentId, R.id.set1)
        }
    }
)

motion_layout.transitionToEnd()

И затем control, затем вызовите motion_layout.transitionToEnd () каждый раз, когда вы хотите изменить состояние

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