web-dev-qa-db-fra.com

Modifier le pourcentage de la recommandation dans la disposition des contraintes par programme

J'ai une ligne directrice dans la disposition de contrainte 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 autre chose de manière conditionnelle. Comment puis-je atteindre cet objectif.

30

Il y a deux façons de le faire:

Cette méthode récupère un paramètre spécifique à partir de la variable ConstraintLayout et le modifie.

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 à cloner les attributs ConstraintLayout, à les modifier puis à les appliquer à 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);

Créer un effet de parallaxe

Pour tester ces méthodes, j'ai créé une animation de parallaxe utilisant une GuideLine et une ScrollView au-dessus.

Sur le AndroidManifest.xml, dans votre Activity, ajoutez 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épondre à propos de la parallaxe si quelqu'un est intéressé. ;) 

32

Ce code vous changera guidePercent to 0

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

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 ensemble de contraintes, appeler la méthode clone en transmettant constraintlayout, puis appeler setGuidelinePercent en transmettant l’id et le ratio de la directive.

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

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

Dans Kotlin & inside Fragment ou d’autres activités, définissez l’application GuideLine: les paramètres associés présentent quelques difficultés, mais j’ai résolu le problème de la manière suivante: 

 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 de guidage dans notre mise en page 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"  />
0
Hamed Jaliliani