Android开发中MotionLayout的motion:duration属性无法控制动画速度的问题求助
Android开发中MotionLayout的motion:duration属性无法控制动画速度的问题求助
各位好,我现在在Visual Studio里开发Android应用,用MotionLayout实现一个布局的滑入滑出效果,但是发现设置motion:duration属性好像没法按照预期控制动画的速度,想请大家帮忙看看问题出在哪。
我的需求很简单:让layout_dose_frame这个布局实现从左/右侧滑入,以及滑出到左/右侧的动画,我已经在motion_item_scene.xml里配置了对应的ConstraintSet和Transition,并且给每个Transition都设置了motion:duration="100"(也就是100毫秒),但实际运行起来动画的速度和预期不太对,或者说duration配置没生效?
先贴出我的motion_item_scene.xml代码:
<?xml version="1.0" encoding="utf-8"?> <MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:motion="http://schemas.android.com/apk/res-auto"> <!-- SLIDE IN LEFT --> <ConstraintSet android:id="@+id/start_slide_in_left"> <Constraint android:id="@id/layout_dose_frame" android:translationX="-400dp" /> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint android:id="@id/layout_dose_frame" android:translationX="0dp" /> </ConstraintSet> <Transition motion:constraintSetStart="@id/start_slide_in_left" motion:constraintSetEnd="@id/end" motion:duration="100" /> <!-- SLIDE IN RIGHT --> <ConstraintSet android:id="@+id/start_slide_in_right"> <Constraint android:id="@id/layout_dose_frame" android:translationX="400dp" /> </ConstraintSet> <Transition motion:constraintSetStart="@id/start_slide_in_right" motion:constraintSetEnd="@id/end" motion:duration="100" /> <!-- SLIDE OUT LEFT --> <ConstraintSet android:id="@+id/end_slide_out_left"> <Constraint android:id="@id/layout_dose_frame" android:translationX="-400dp" /> </ConstraintSet> <Transition motion:constraintSetStart="@id/end" motion:constraintSetEnd="@id/end_slide_out_left" motion:duration="100" /> <!-- SLIDE OUT RIGHT --> <ConstraintSet android:id="@+id/end_slide_out_right"> <Constraint android:id="@id/layout_dose_frame" android:translationX="400dp" /> </ConstraintSet> <Transition motion:constraintSetStart="@id/end" motion:constraintSetEnd="@id/end_slide_out_right" motion:duration="100" /> </MotionScene>
再贴出对应的布局文件代码(注:原始代码末尾存在截断,以下为完整可展示部分):
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/motionLayout" android:layout_width="match_parent" android:layout_height="@dimen/dose_item_badge_frame_size" app:layoutDescription="@xml/motion_item_scene"> <RelativeLayout android:id="@+id/layout_dose_color" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/dose_bg_mild" android:orientation="horizontal"> <RelativeLayout android:id="@+id/layout_dose_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/dose_bg_light"/> <RelativeLayout android:id="@+id/product_frame_image" android:layout_width="@dimen/dose_item_badge_frame_size" android:layout_height="@dimen/dose_item_badge_frame_size" android:layout_alignParentLeft="true"> <ImageView android:id="@+id/product_image" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="fill" android:layout_margin="@dimen/dose_item_badge_padding_light" android:src="@drawable/abomb_badge"/> <ImageView android:id="@+id/product_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="fill" android:src="@drawable/dose_frame_out_light"/> </RelativeLayout> <ImageView android:id="@+id/product_dp" android:layout_width="@dimen/dose_item_right_padding" android:layout_height="match_parent" android:layout_alignParentRight="true"/> <ImageView android:id="@+id/product_add_button" android:layout_width="@dimen/dose_item_button_size" android:layout_height="@dimen/dose_item_button_size" android:layout_toLeftOf="@id/product_dp" android:layout_centerVertical="true" android:src="@drawable/dose_btn_add_light"/> <ImageView android:id="@+id/product_detail_button" android:layout_width="@dimen/dose_item_button_size" android:layout_height="@dimen/dose_item_button_size" android:layout_marginRight="@dimen/dose_item_button_padding" android:layout_toLeftOf="@id/product_add_button" android:layout_centerInParent="true" android:src="@drawable/dose_btn_detail_light"/> </RelativeLayout> </androidx.constraintlayout.motion.widget.MotionLayout>
我反复检查了Transition的duration配置,确实都设成了100毫秒,但实际运行时动画速度要么不符合预期,要么感觉这个配置根本没起作用。有没有大佬能帮我排查下问题?比如是不是ConstraintSet的配置逻辑有问题,或者MotionLayout还有其他控制动画速度的属性需要配合设置?
内容来源于stack exchange
相关产品推荐
相关产品推荐

