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.
Il y a deux façons de le faire:
ConstraintLayout.LayoutParams
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);
ConstraintSet
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);
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é. ;)
Ce code vous changera guidePercent to 0
ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams) guideline.getLayoutParams();
lp.guidePercent = 0;
guideline.setLayoutParams(lp);
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);
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" />