我在应用程序中有一个MotionLayout,可以进行滑动过渡。目前,我刚刚从2.0.0-alpha3
更新到2.0.0-alpha4
版本,有些事情没有像以前那样起作用。
有一个“ myView”,它是一种布局,应从屏幕底部扩展到标题视图。它有一个准则的约束顶部,我需要以编程方式进行控制(基于某些用户操作)。
代码中没有其他更改,因此降级为alpha3可使一切正常运行。
代码很基本:
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetEnd="@id/end"
motion:constraintSetStart="@id/start"
motion:duration="1000"
motion:interpolator="linear">
<!-- I used motion:motionInterpolator="linear" for alpha4-->
<OnSwipe
motion:dragDirection="dragUp"
motion:touchAnchorId="@id/myView"
motion:touchAnchorSide="top" />
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@id/myView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="@id/myGuideline" />
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id="@id/myView"
android:layout_width="match_parent"
android:layout_height="0dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toBottomOf="@id/someHeaderView" />
</ConstraintSet>
</MotionScene>
问题在于,在发行版alpha3中,我可以使用类似的代码(并且有效):
myMotionLayout.getConstraintSet(R.id.start)?.setGuidelinePercent(R.id.myGuideline, guidelinePercentage)
现在我已升级到2.0.0-alpha4
,这不再起作用,我也不明白为什么。它总是从xml中获取默认值,并且每次尝试动态更改时都不会更改。
我要做的是基于一些动态数据(在Fragment的开头或当用户返回它时可用)更改过渡的起点。如果您对如何使用MotionLayout实施此方法有更好的了解,请给我一个提示。
Gradle实现:
implementation "com.android.support.constraint:constraint-layout:2.0.0-alpha4"
答案 0 :(得分:0)
我注意到alpha4版本中引入了类似的回归。通过反复试验和以下错误报告,我得以将ConstraintSet更改以编程方式应用于MotionLayout(beta1版本)中。看来克隆方法不适用于MotionLayout,而应改用getConstraintSet(如您所愿)。看来您缺少的步骤是constraintSet.applyTo(motion_layout)
。最后,我还需要重新应用MotionLayout描述xml。
实施 “ androidx.constraintlayout:constraintlayout:2.0.0-beta1”
步骤:
val constraintSet = motion_layout.getConstraintSet(R.id.motion_layout)
constraintSet.clear(R.id.txt_view, ConstraintSet.BOTTOM)
constraintSet.applyTo(motion_layout)
// If using a MotionLayout description xml file, re-apply it
motion_explore_article.loadLayoutDescription(R.xml.slide_over_image)