Android 重力布局动画

Android 重力布局动画,android,android-layout,Android,Android Layout,在Android中,是否可以在layout\u gravity上应用动画?例如,假设我想从右向左更改视图的布局(例如按钮) <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:l

在Android中,是否可以在
layout\u gravity
上应用动画?例如,假设我想从右向左更改
视图的
布局
(例如
按钮

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_gravity="right|top" />
</FrameLayout>


在上面的布局文件中,我想在运行时通过动画将布局重力从
right | top
更改为
left | top
,是否可能?谢谢

使用布局重力属性是不可能的。您可以借助永远运行的“平移”动画来实现此效果

Animation animation = new TranslateAnimation(0, 500,0, 0);
animation.setDuration(1000);
animation.setFillAfter(true);
myImage.startAnimation(animation);

此代码只会将x轴上的位置更改为+500

您可以在父视图组上使用LayoutTransition使其对子视图的更改设置动画,例如布局更改。在下面的示例中,我设置了一个浮动动作按钮的动画,从屏幕的右下角到右上角,同时旋转它(使“+”图标变成“x”图标)

将包含布局上的animateLayoutChanges设置为true:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/pnlFabContainer"
    android:animateLayoutChanges="true"
    android:clipChildren="false">

    <ExpandableListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:id="@+id/lstWhatever"
        android:divider="@color/DividerDarkGrey"
        android:dividerHeight="1dp"
        android:choiceMode="singleChoice"
        android:groupIndicator="@null"
        android:padding="20dp"/>

    <com.melnykov.fab.FloatingActionButton
        android:id="@+id/fabMultiSelect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="24dp"
        android:src="@drawable/button_plus"
        android:scaleType="center"
        fab:fab_type="normal"
        fab:fab_colorNormal="@color/FloatingActionButton"
        fab:fab_colorPressed="@color/FloatingActionButtonPressed"
        fab:fab_colorRipple="@color/FloatingActionButtonRipple" />

</FrameLayout>
然后以编程方式更改布局重力-我同时也在做旋转动画:

protected void animateFabButton(FloatingActionButton fab) {
    if (fab.isSelected()) {
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)fab.getLayoutParams();
        layoutParams.gravity = Gravity.TOP | Gravity.END;
        layoutParams.topMargin = -(fab.getMeasuredHeight() / 2);
        fab.setLayoutParams(layoutParams);

        Animation rotate = new RotateAnimation(0, 45, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setFillBefore(true);
        rotate.setFillAfter(true);
        rotate.setFillEnabled(true);
        rotate.setDuration(750);
        rotate.setRepeatCount(0);
        rotate.setInterpolator(new LinearInterpolator());
        fab.startAnimation(rotate);
    }
    else {
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)fab.getLayoutParams();
        layoutParams.gravity = Gravity.BOTTOM | Gravity.END;
        layoutParams.topMargin = layoutParams.bottomMargin;
        fab.setLayoutParams(layoutParams);

        Animation rotate = new RotateAnimation(45, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setFillBefore(true);
        rotate.setFillAfter(true);
        rotate.setFillEnabled(true);
        rotate.setDuration(750);
        rotate.setRepeatCount(0);
        rotate.setInterpolator(new LinearInterpolator());
        fab.startAnimation(rotate);
    }
}

感谢Breeno,这不仅适用于子视图重力变化,而且适用于容器重力变化
protected void animateFabButton(FloatingActionButton fab) {
    if (fab.isSelected()) {
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)fab.getLayoutParams();
        layoutParams.gravity = Gravity.TOP | Gravity.END;
        layoutParams.topMargin = -(fab.getMeasuredHeight() / 2);
        fab.setLayoutParams(layoutParams);

        Animation rotate = new RotateAnimation(0, 45, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setFillBefore(true);
        rotate.setFillAfter(true);
        rotate.setFillEnabled(true);
        rotate.setDuration(750);
        rotate.setRepeatCount(0);
        rotate.setInterpolator(new LinearInterpolator());
        fab.startAnimation(rotate);
    }
    else {
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)fab.getLayoutParams();
        layoutParams.gravity = Gravity.BOTTOM | Gravity.END;
        layoutParams.topMargin = layoutParams.bottomMargin;
        fab.setLayoutParams(layoutParams);

        Animation rotate = new RotateAnimation(45, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setFillBefore(true);
        rotate.setFillAfter(true);
        rotate.setFillEnabled(true);
        rotate.setDuration(750);
        rotate.setRepeatCount(0);
        rotate.setInterpolator(new LinearInterpolator());
        fab.startAnimation(rotate);
    }
}