ConstraintSet不适用于嵌套的ConstraintLayouts

时间:2019-11-25 16:16:21

标签: android android-layout kotlin android-constraintlayout

我有两个活动activity_main.xmlactivity_main_details.xml,我希望从第一个活动中的元素过渡到第二个活动。

第一次活动:

enter image description here

此活动由两个单独的约束布局组成,这两个约束布局包含在另一个布局中。下面的代码:

<androidx.constraintlayout.widget.ConstraintLayout
    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"
    android:id="@+id/root">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@color/background_color"
        android:transitionName="firstHalf"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_marginTop="64dp"
            android:src="@drawable/ic_add"
            android:transitionName="photo"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:text="@string/add_log_here"
            android:textColor="@color/white"
            android:textSize="18sp"
            android:transitionName="title"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/photo" />


    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.35" />

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:transitionName="secondHalf"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/guideline">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/guideline">

     <-- more code here -->>

第二个活动是:

enter image description here

<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:id="@+id/root"
    tools:context=".authenthicaton.joinUs.add_company_logo_animation">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@color/background_color"
        android:transitionName="firstHalf"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginStart="32dp"
            android:layout_marginTop="8dp"
            android:src="@drawable/ic_add"
            android:transitionName="photo"
            app:layout_constraintStart_toEndOf="@+id/textView4"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="24dp"
            android:layout_marginTop="16dp"
            android:text="@string/add_log_here"
            android:textColor="@color/white"
            android:textSize="18sp"
            android:transitionName="title"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.08" />

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:transitionName="secondHalf"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/guideline">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/constraintLayout2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/guideline">
     <-- more code here -->

问题在于元素应进行过渡:

  •   

    照片@+id/photo

  •   

    textView @+id/textView4

他们应该将位置从第一个活动更改为第二个活动。换句话说,第二个活动应该是动画之后的结果。

这是实际的kotlin代码:

        val root = findViewById<ConstraintLayout>(R.id.root)
        var set = false
        val constraint1 = ConstraintSet()
        constraint1.clone(root)
        val constraint2 = ConstraintSet()
        constraint2.clone(this, R.layout.activity_main_details)
        val floatingActionButton = findViewById<FloatingActionButton>(R.id.floatingActionButton)

        floatingActionButton.setOnClickListener{
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                val transition = ChangeBounds()
                transition.duration = 300
                TransitionManager.beginDelayedTransition(root, transition)
                val constraint = if(set) constraint1 else constraint2
                constraint.applyTo(root)
                set = !set
            }
        }

我的结果(动画后):

enter image description here

如您所见,照片和文本视图没有更改其第一个位置。这就是为什么他们不在那里的原因。 我也尝试过使用ActivityOptions.makeSceneTransitionAnimation,但是由于我遇到了与编辑文本框有关的焦点问题,这使我的代码非常复杂。

有人知道为什么照片和文本视图没有像应该做的那样改变吗? constrainSet是否存在嵌套约束布局问题?

1 个答案:

答案 0 :(得分:0)

我在ConstrainSet上还没有取得成功,所以我最终使用了scene,它在我的情况下确实有效。

由于我有多个嵌套的ConstrainedLayouts,因此ConstrainedSet不会像@Pawel所指出的那样起作用。为每个子孩子声明ConstrainedSet也不起作用。

无论如何,这是我使用scene的解决方案。

val transition = ChangeBounds()

transition.duration = 800

val scene = Scene.getSceneForLayout(findViewById<ConstraintLayout>(R.id.root),
                                         R.layout.activity_main_details,
                                         this)
findViewById<FloatingActionButton>(R.id.floatingActionButton).setOnClickListener {
            TransitionManager.go(scene, transition)
// more code here
}