如何以编程方式更改MotionLayout中KeyAttribute中的旋转

时间:2018-08-07 15:33:09

标签: android-animation

在重复运动场景时,我需要将旋转角度从30度更改为-30度。如何以编程方式执行此操作?

R.xml.scene_01:

<MotionScene 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:motion="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Transition
        motion:constraintSetStart="@id/start"
        motion:constraintSetEnd="@id/end"
        motion:duration="2000">

        <KeyFrameSet>
            <KeyAttribute
                android:rotation="30"
                motion:target="@id/button"
                android:scaleX="1.3"
                android:scaleY="1.3"
                motion:framePosition="50"/>
        </KeyFrameSet>
    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint
            android:id="@id/button"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:src="@drawable/tut_ali_icon"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint
            android:id="@id/button"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:src="@drawable/tut_ali_icon"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </ConstraintSet>

</MotionScene>

MotionLayout中的监听器:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mMotionLayout.setTransitionListener(new MotionLayout.TransitionListener() {
            @Override
            public void onTransitionChange(MotionLayout motionLayout, int i, int i1, float v) {

            }

            @Override
            public void onTransitionCompleted(MotionLayout motionLayout, int currentId) {
                if(currentId == R.id.end){
                    motionLayout.loadLayoutDescription(R.xml.scene_02);
                    motionLayout.transitionToStart();
                }else{
                    motionLayout.loadLayoutDescription(R.xml.scene_01);
                    motionLayout.transitionToEnd();
                }
            }
        });
        mMotionLayout.transitionToEnd();

    }

我需要在onTransitionCompleted方法中更改旋转。作为一种选择,我可以使用各种KeyAttribute创建哪个KeyFrameSet吗?

在R.xml.scene_02中,我仅更改了 android:rotation =“-30” ,但 loadLayoutDescription 方法似乎无效。

我想得到的照片中的这样一个动作: enter image description here

1 个答案:

答案 0 :(得分:0)

没有足够的代表评论,但是为什么要指定2个单独的转换?

尝试理解该问题,如果您希望它与该侦听器一致旋转,则应执行以下操作:

<Transition
    motion:constraintSetEnd="@id/end"
    motion:constraintSetStart="@id/start"
    motion:duration="2000">

    <KeyFrameSet>
        <KeyAttribute
            android:rotation="-45"
            android:scaleX="2"
            android:scaleY="2"
            motion:framePosition="0"
            motion:target="@id/button" />
        <KeyAttribute
            android:rotation="45"
            android:scaleX="2"
            android:scaleY="2"
            motion:framePosition="50"
            motion:target="@id/button" />
        <KeyAttribute
            android:rotation="-45"
            android:scaleX="2"
            android:scaleY="2"
            motion:framePosition="100"
            motion:target="@id/button" />
    </KeyFrameSet>

</Transition>

按钮开始和结束时的旋转角度为-45度,在过渡过程中途旋转到45度。请注意,这些只是值动画,因此它们在到达起点或终点时将不会应用于对象-您需要在起点/终点ConstraintSet属性中指定旋转角度。