如何在不旋转阴影的情况下旋转浮动操作按钮?
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.
我旋转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.