【问题标题】:How to rotate floating action button without rotating shadow?如何在不旋转阴影的情况下旋转浮动动作按钮?
【发布时间】:2015-10-12 06:45:06
【问题描述】:

我以如此简单的方式旋转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 图像,如果有任何区别)。

【问题讨论】:

标签: android rotation android-animation floating-action-button


【解决方案1】:

您是否尝试过 Compat 库提供的 animate 方法?我在使用动画工具时也遇到了同样的问题

final OvershootInterpolator interpolator = new OvershootInterpolator();
ViewCompat.animate(fab).
           rotation(135f).
           withLayer().
           setDuration(300).
           setInterpolator(interpolator).
           start();

【讨论】:

  • 这仍然是旋转阴影
  • 并引入一个奇怪的阴影剪辑!
  • 与设计支持库 23.2.0 一起工作正常!没有阴影旋转(在 6.0、4.4 上测试)。 OvershootInterpolator 很酷:)
  • 用最新的支持库 24.1.1 测试并且工作正常。在 Android 4.4.4 Samsung Neo 和 Android 5.0.1 Micromax Bolt 上
  • 如何在 fab 中设置图标的旋转而不是动画?
【解决方案2】:
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();
}

【讨论】:

  • 这很好用。我怎样才能达到同样的效果,但没有动画?意思是我想立即设置轮播?
  • 将持续时间设置为 0L
【解决方案3】:

还有另一种方法对我来说完美无缺(接受的答案中建议的方法会在 pre-L 上产生剪裁的阴影)。创建一个 XML 可绘制对象并将您的 FAB 图标包装到 &lt;rotate&gt; 标记中,如下所示:

<?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>

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

【讨论】:

  • 旁注:如果drawable是矢量,你不能使用位图,你可以尝试一下:&lt;rotate drawable="@drawable/ic_add_white_24dp" ...
【解决方案4】:

最短路径: 对于顺时针旋转:

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

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

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

【讨论】:

    【解决方案5】:

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

      moveRight.rotation = -180f
    

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2021-02-09
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多