有两种方法可以实现:
该方法从ConstraintLayout
获取特定参数并进行修改。
Guideline guideLine = (Guideline) findViewById(R.id.your_guideline)
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideLine.getLayoutParams()
params.guidePercent = 0.45f
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);
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();
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;
Log.d("mLog", String.valueOf(percentage));
if(percentage >= 0) {
params.guidePercent = 0.12f - percentage;
guideTopInfo.setLayoutParams(params);
}
}
});
}
如果有人感兴趣,可以看看我关于视差滚动的另一个答案。 ;)