63 votes

Modifier le pourcentage de ligne directrice dans la disposition des contraintes par programme

J'ai une ligne directrice dans la disposition des contraintes comme celle-ci

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

Plus tard, je veux changer la valeur app:layout_constraintGuide_percent en quelque chose d'autre conditionnellement. Comment puis-je atteindre cet objectif.

74voto

Nícolas Schirmer Points 394

Il y a deux façons de le faire:

Cette méthode d'obtenir un paramètre spécifique de l' ConstraintLayout et de le modifier.

Guideline guideLine = (Guideline) findViewById(R.id.your_guideline);
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideLine.getLayoutParams();
params.guidePercent = 0.45f; // 45% // range: 0 <-> 1
guideLine.setLayoutParams(params);

Cette méthode consiste dans le clonage de l' ConstraintLayout attributs, en les modifiant et en appliquant à l' View.

MAIS c'est très lent.

ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.your_constraint_with_guideline);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);        
constraintSet.setGuidelinePercent(R.id.your_guideline, 0.07f); // 7% // range: 0 <-> 1
TransitionManager.beginDelayedTransition(constraintLayout);
constraintSet.applyTo(constraintLayout);

La création d'un effet de parallaxe

Pour tester ces méthodes, j'ai créé une parallaxe de l'animation à l'aide d'un GuideLine et ScrollView sur le dessus.

Sur l' AndroidManifest.xml, à l'intérieur de votre Activity, ajouter ceci: android:hardwareAccelerated="true".

     <activity 
        android:name=".MainActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:hardwareAccelerated="true">
     ...

MainActivity.java

Guideline guideTopInfo;
ConstraintLayout constraintLayout;
ConstraintLayout.LayoutParams params;
ConstraintSet constraintSet;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    guideTopInfo = (Guideline) findViewById(R.id.guideline2);
    constraintLayout = (ConstraintLayout) findViewById(R.id.constraint_root);
    params = (ConstraintLayout.LayoutParams) guideTopInfo.getLayoutParams();

    //constraintSet = new ConstraintSet();
    //constraintSet.clone(constraintLayout);

    final ScrollView scrollView = (ScrollView) findViewById(R.id.scroll_front);
    scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            float percentage = scrollView.getScrollY() * 0.0001f; // 0.001f faster // 0.00001f slower parallax animation

            Log.d("mLog", String.valueOf(percentage));
            if(percentage >= 0) {
                // my XML percentage value was 12%
                params.guidePercent = 0.12f - percentage; // up
                //params.guidePercent = 0.12f + percentage; // downm
                guideTopInfo.setLayoutParams(params);

                //constraintSet.setGuidelinePercent(R.id.guideline2, 0.12f - percentage);
                //TransitionManager.beginDelayedTransition(constraintLayout);
                //constraintSet.applyTo(constraintLayout);
            }
        }
    });
}

Mon autre réponse sur la parallaxe si quelqu'un est intéressé. ;)

17voto

Vadym Points 323

Ce code va changer votre guidePourcent à 0

 ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams) guideline.getLayoutParams();
lp.guidePercent = 0;
guideline.setLayoutParams(lp);
 

2voto

Arnav Rao Points 2156

Vous devez utiliser l'objet ConstraintSet pour définir layout_constraintGuide_percent dans le code.

Vous trouverez ci-dessous le code pour définir layout_constraintGuide_percent dans le code. Vous devez d'abord créer un objet d'ensemble de contraintes, appeler la méthode clone en passant constraintlayout, puis appeler setGuidelinePercent en passant l'id et le ratio de la ligne directrice.

     ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);

    constraintSet.setGuidelinePercent(R.id.guideline, 0.4f);
 

1voto

Hamed Jaliliani Points 452

Dans Kotlin & Inside Fragment ou d'autres activités, définissez l'application GuideLine: les paramètres associés ont un peu de difficulté, mais je l'ai résolu de cette façon:

  val view = inflate(this, R.layout.ly_custom_menu_item_wallet_side_menu, null)
 val guideL = view.findViewById<Guideline>(R.id.guideline_wallet)
          var constParam: ConstraintLayout.LayoutParams = guideL.layoutParams as ConstraintLayout.LayoutParams
          constParam.guidePercent = 0.42f
          guideL.layoutParams = constParam
 

et ceci est un élément Guideline dans notre disposition ly_custom_menu_item_wallet_side_menu.xml:

  <androidx.constraintlayout.widget.Guideline 
    android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@+id/guideline_wallet"
    android:orientation="vertical" 
   app:layout_constraintGuide_end="84dp"  />
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X