在约束布局中以编程方式更改指南线百分比的指南

75

我在ConstraintLayout中有一个约束指南,就像这样

<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的值。如何实现这一点。

6个回答

86

有两种方法可以实现:

该方法从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);
            }
        }
    });
}

如果有人感兴趣,可以看看我关于视差滚动的另一个答案。 ;)


1
我尝试使用Constraintset,但什么也没有发生。你有任何想法从哪里开始搜索问题吗? - kilian eller
@kilianeller我建议使用ConstraitLayout.LayoutParams,因为Constraintset太慢了。无论如何,请检查以下几点:1-您是否正确设置了ID?2-当您在XML上手动更改指南时,视图是否会更改其轴? - Nícolas Schirmer
在XML中更改指南线按预期工作。ConstraitLayout.LayoutParams也按预期工作 - 我只是想使用Constraintset来实现简单的动画效果。 - kilian eller

17

这段代码将把你的guidePercent更改为0。

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

16
guideline.setGuidelinePercent(value: Float)

这足以在运行时更改指南线百分比。


1
在运行时,这似乎对我不起作用。 - SilleBille

10
您可以通过将其居中处理来使其更加美观,这对我很有帮助,希望也能对您有所帮助。
<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" />

2

您需要使用ConstraintSet对象在代码中设置layout_constraintGuide_percent。

以下是在代码中设置layout_constraintGuide_percent的代码。首先,您需要创建一个约束集对象,调用clone方法传递constraintlayout,然后调用setGuidelinePercent传递guideline id和ratio。

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

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

1
在 Kotlin 中,在 Fragment 或其他活动中设置 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

这是我们的ly_custom_menu_item_wallet_side_menu.xml布局中的Guideline元素:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接