Изменить процент направляющих в макете ограничения программно

У меня есть руководство по макету ограничений, подобное этому

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

Позже я хочу условно изменить значение app:layout_constraintGuide_percent на что-то другое. Как я могу этого добиться.


person Mithun Sarker Shuvro    schedule 11.12.2016    source источник


Ответы (6)


Есть два способа сделать это:

Этот метод получает определенный параметр из ConstraintLayout и изменяет его.

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

Этот метод заключается в клонировании атрибутов ConstraintLayout, их изменении и последующем применении к атрибуту View.

НО это очень медленно.

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

Создание эффекта параллакса

Чтобы проверить эти методы, я создал анимацию параллакса, используя GuideLine и ScrollView сверху.

На AndroidManifest.xml внутри Activity добавьте следующее: 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);
            }
        }
    });
}

Мой другой ответ о параллаксе, если кому-то интересно. ;)

person Nícolas Schirmer    schedule 26.05.2017
comment
Я пытался использовать Constraintset - ничего не произошло. У вас есть идеи, где я мог бы начать искать проблему? - person kilian eller; 20.11.2018
comment
@kilianeller Я предлагаю использовать ConstraintLayout.LayoutParams из-за того, что Constraintset работает слишком медленно. В любом случае, проверьте следующее: 1- Правильно ли вы установили идентификатор? 2- Когда вы вручную меняете руководство в XML, представление меняет ось? - person Nícolas Schirmer; 21.11.2018
comment
Изменение руководства в XML работает должным образом. ConstraitLayout.LayoutParams также работает, как и ожидалось — я просто хотел использовать Constraintset для легкой анимации. - person kilian eller; 21.11.2018

Этот код изменит значение guidePercent на 0.

ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams) guideline.getLayoutParams();
lp.guidePercent = 0;
guideline.setLayoutParams(lp);
person Vadym    schedule 26.12.2016

ты делаешь это по центру, это сработало со мной, я надеюсь, что это поможет

<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" />
person eng mohamed emam    schedule 05.01.2020

guideline.setGuidelinePercent(value: Float)

Этого достаточно, чтобы изменить рекомендуемый процент во время выполнения.

person Shashank Mishra    schedule 26.12.2019

Вам нужно использовать объект ConstraintSet для установки layout_constraintGuide_percent в коде.

Ниже приведен код для установки layout_constraintGuide_percent в коде. Сначала вам нужно создать объект набора ограничений, вызвать метод клонирования, передав ограничение, а затем вызвать setGuidelinePercent, передав идентификатор направляющей и соотношение.

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

    constraintSet.setGuidelinePercent(R.id.guideline, 0.4f);
person Arnav Rao    schedule 23.04.2017

В Kotlin и внутри фрагмента или других действий установите приложение GuideLine: связанные параметры имеют небольшую сложность, но я решил это следующим образом:

 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

и это элемент Guideline внутри нашего макета 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"  />
person Hamed Jaliliani    schedule 02.01.2019