You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:04:51