Ändern Sie den Richtlinienprozentsatz im Beschränkungslayout programmgesteuert

Lesezeit: 4 Minuten

Ich habe eine Richtlinie für das Constraint-Layout wie diese

<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"/>

Später möchte ich das ändern app:layout_constraintGuide_percent Wert auf etwas anderes bedingt. Wie kann ich das erreichen.

Benutzer-Avatar
Nicolas Schirmer

Es gibt zwei Möglichkeiten, dies zu tun:

Diese Methode erhält einen bestimmten Parameter aus der ConstraintLayout und ändern Sie es.

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);

Diese Methode besteht darin, die ConstraintLayout Attribute, ändern Sie sie und wenden Sie sie dann auf die an View.

ABER es ist sehr langsam.

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);

Erstellen eines Parallax-Effekts

Um diese Methoden zu testen, habe ich eine Parallaxenanimation mit a erstellt GuideLine und ein ScrollView oben drauf.

Auf der AndroidManifest.xmlin deinem Activityfüge das hinzu: 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);
            }
        }
    });
}

Meine andere Antwort zu Parallaxe, falls es jemanden interessiert. 😉

  • Ich habe versucht, Constraintset zu verwenden – nichts ist passiert. Hast du eine Idee, wo ich anfangen könnte, das Problem zu suchen?

    – kilian eller

    19. November 2018 um 22:30 Uhr

  • @kilianeller Ich schlage vor, ConstraitLayout.LayoutParams zu verwenden, da Constraintset zu langsam ist. Wie auch immer, überprüfen Sie diese Dinge: 1- Haben Sie die ID richtig eingestellt? 2- Wenn Sie Ihre Richtlinie manuell im XML ändern, ändert die Ansicht die Achse?

    – Nicolas Schirmer

    21. November 2018 um 13:00 Uhr

  • Das Ändern der Richtlinie in XML funktioniert wie erwartet. ConstraitLayout.LayoutParams funktioniert auch wie erwartet – ich wollte nur Constraintset für eine einfache Animation verwenden.

    – kilian eller

    21. November 2018 um 17:51 Uhr

Benutzer-Avatar
Vadym

Dieser Code ändert Ihren guidePercent auf 0

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

Benutzer-Avatar
Shashank Mishra

guideline.setGuidelinePercent(value: Float)

Dies reicht aus, um den Richtwert zur Laufzeit zu ändern.

  • Irgendwie scheint das bei mir zur Laufzeit nicht zu funktionieren

    – SilleBille

    22. November 2021 um 19:23 Uhr

Sie Cam machen es zentriert, es hat bei mir funktioniert, ich hoffe, es hilft

<androidx.constraintlayout.widget.Guideline
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintGuide_percent="0.5"
                    app:layout_constraintStart_toStartOf="parent" />

Sie müssen das ConstraintSet-Objekt verwenden, um layout_constraintGuide_percent im Code festzulegen.

Unten ist der Code zum Festlegen von layout_constraintGuide_percent im Code. Zuerst müssen Sie ein Constraint-Set-Objekt erstellen, die Clone-Methode aufrufen, die Constraintlayout übergibt, und dann setGuidelinePercent aufrufen, um die Richtlinien-ID und das Verhältnis zu übergeben.

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

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

Benutzer-Avatar
Hamed Jaliliani

In Kotlin & Inside Fragment oder anderen Aktivitäten, set GuideLine app: Related parameters hat ein wenig Schwierigkeiten, aber ich habe es auf diese Weise gelöst:

 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

und dies ist ein Richtlinienelement in unserem ly_custom_menu_item_wallet_side_menu.xml-Layout:

 <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"  />

1227960cookie-checkÄndern Sie den Richtlinienprozentsatz im Beschränkungslayout programmgesteuert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy