2

我剛剛開始學習約束佈局,這很酷,我來到主題ConstraintSet並卡住了。在Android中,ConstraintSet如何與ConstraintLayouts協同工作?

我在開發人員文檔中看到了一個ConstraintSet的例子,但我無法得到這個想法,我已經實現了代碼,因爲它是工作的,但我對這個概念還不太清楚。

約束如何在不同的ConstraintSet中工作是我想知道的。

這裏是我做了什麼:

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.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/act_main" 
    tools:context="com.reversebits.constraintanimdemo.MainActivity"> 

    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="8dp" 
     android:layout_marginStart="8dp" 
     android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum" 
     app:layout_constraintEnd_toStartOf="@+id/guideline2" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     android:layout_marginTop="8dp" /> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="0dp" 
     android:layout_height="160dp" 
     app:srcCompat="@mipmap/ic_launcher" 
     app:layout_constraintEnd_toEndOf="parent" 
     android:layout_marginEnd="8dp" 
     app:layout_constraintTop_toTopOf="parent" 
     android:layout_marginTop="8dp" 
     app:layout_constraintStart_toStartOf="@+id/guideline2" 
     android:layout_marginStart="8dp" /> 

    <android.support.constraint.Guideline 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/guideline" 
     android:orientation="vertical" 
     app:layout_constraintGuide_end="364dp" /> 

    <android.support.constraint.Guideline 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/guideline2" 
     android:orientation="vertical" 
     app:layout_constraintGuide_percent="0.5" /> 


    <Button 
     android:onClick="foo" 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_marginBottom="8dp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     android:layout_marginEnd="8dp" 
     android:layout_marginRight="8dp"/> 

</android.support.constraint.ConstraintLayout> 

clone.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.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" 
    tools:context="com.reversebits.constraintanimdemo.MainActivity"> 

    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum" 
     app:layout_constraintStart_toStartOf="parent" 
     android:layout_marginEnd="8dp" 
     app:layout_constraintEnd_toEndOf="parent" 
     android:layout_marginStart="8dp" 
     android:id="@+id/textView" 
     app:layout_constraintTop_toTopOf="parent" 
     android:layout_marginTop="8dp" /> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="0dp" 
     android:layout_height="160dp" 
     app:srcCompat="@mipmap/ic_launcher" 
     app:layout_constraintEnd_toEndOf="parent" 
     android:layout_marginEnd="8dp" 
     app:layout_constraintStart_toStartOf="parent" 
     android:layout_marginStart="8dp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     android:layout_marginBottom="8dp" 
     android:layout_marginTop="8dp" 
     app:layout_constraintTop_toBottomOf="@+id/textView" /> 

    <Button 
     android:onClick="foo" 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_marginBottom="8dp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     android:layout_marginEnd="8dp" 
     android:layout_marginRight="8dp"/> 

</android.support.constraint.ConstraintLayout> 

和MainActivity放在這裏:

import android.content.Context; 
import android.os.Build; 
import android.support.constraint.ConstraintLayout; 
import android.support.constraint.ConstraintSet; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.transition.TransitionManager; 
import android.view.View; 

public class MainActivity extends AppCompatActivity { 

    ConstraintSet mConstraintSet1 = new ConstraintSet(); // create a Constraint Set 
    ConstraintSet mConstraintSet2 = new ConstraintSet(); // create a Constraint Set 
    ConstraintLayout mConstraintLayout; // cache the ConstraintLayout 
    boolean mOld = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Context context = this; 
     mConstraintSet2.clone(context, R.layout.clone); // get constraints from layout 
     setContentView(R.layout.activity_main); 
     mConstraintLayout = (ConstraintLayout) findViewById(R.id.act_main); 
     mConstraintSet1.clone(mConstraintLayout); // get constraints from ConstraintSet 

    } 

    public void foo(View view) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      TransitionManager.beginDelayedTransition(mConstraintLayout); 
     } 
     if (mOld = !mOld) { 
      mConstraintSet1.applyTo(mConstraintLayout); // set new constraints 
     } else { 
      mConstraintSet2.applyTo(mConstraintLayout); // set new constraints 
     } 
    } 
} 

回答

0

比方說,你想有一個按鈕,點擊後的一些看法走動。例如,您可以在activity_main.xml中定義佈局,並使用其中的按鈕。要獲得主佈局的ConstraintSet,請調用mConstraintSet1.clone(mConstraintLayout)。從輔助佈局文件clone.xml克隆輔助佈局(按鈕單擊後要顯示的佈局)。該佈局包含具有相同ID的相同視圖,但應用了其他約束。

用戶單擊按鈕後,執行foo()foo()開始動畫Transition,然後將所需的ConstraintSet應用於ConstraintLayout,導致視圖四處移動。由於TransitionManager呼叫,該動作是動畫。