如何在不旋转阴影的情况下旋转浮动操作按钮?

How to rotate floating action button without rotating shadow?

我旋转FAB的方法很简单:

fab.startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate));

rotate.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="1000"/>
</set>

这有效,但它的阴影会与 FAB 一起旋转。但我只需要旋转 FAB(或者甚至是它的 src 图像,如果有任何区别的话)。

你试过Compat库提供的animate方法吗?我在使用 Animation utils

时也遇到了同样的问题
final OvershootInterpolator interpolator = new OvershootInterpolator();
ViewCompat.animate(fab).
           rotation(135f).
           withLayer().
           setDuration(300).
           setInterpolator(interpolator).
           start();
public void rotateFabForward() {
    ViewCompat.animate(fab)
            .rotation(135.0F)
            .withLayer()
            .setDuration(300L)
            .setInterpolator(new OvershootInterpolator(10.0F))
            .start();
}

public void rotateFabBackward() {
    ViewCompat.animate(fab)
            .rotation(0.0F)
            .withLayer()
            .setDuration(300L)
            .setInterpolator(new OvershootInterpolator(10.0F))
            .start();
}

有一种完全适合我的另一种方法(接受的答案中建议的方法会在 pre-L 上产生裁剪阴影)。创建一个 XML 可绘制对象并将您的 FAB 图标包装到一个 <rotate> 标签中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="45">
    <bitmap android:src="@drawable/ic_add_white_24dp"/>
</rotate>

将此可绘制对象设置为您的 FAB,并直接为其级别或 FAB 本身的 imageLevel 属性 设置动画;它从 0 到 10000。如果您想要 OvershootInterpolator,则将 toDegrees 设置为 90 并将级别动画化到 5000 的值,这样它就不会超出范围。

同样可以通过对象动画实现:

  moveRight.rotation = -180f

最短路线: 顺时针旋转:

fab.animate().rotationBy(135f) // 135f = 135 degree.

逆时针旋转(复位到初始位置):

fab.animate().rotationBy(-135f) // 135f = 135 degree.