如何连续动画 Fab 按钮(缩放 in/out)?
How to Animate a Fab button (zoom in/out) continuously?
我想在 FloatingActionButton
上制作这种类型的动画
我试过的
public void animFab() {
ObjectAnimator scaleX = ObjectAnimator.ofFloat(fab, View.SCALE_X, from, to);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(fab, View.SCALE_Y, from, to);
ObjectAnimator translationZ = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, from, to);
AnimatorSet set1 = new AnimatorSet();
set1.playTogether(scaleX, scaleY, translationZ);
set1.setDuration(500);
set1.setInterpolator(new AccelerateInterpolator());
set1.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
ObjectAnimator scaleXBack = ObjectAnimator.ofFloat(fab, View.SCALE_X, to, from);
ObjectAnimator scaleYBack = ObjectAnimator.ofFloat(fab, View.SCALE_Y, to, from);
ObjectAnimator translationZBack = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, to, from);
Path path = new Path();
path.moveTo(0.0f, 0.0f);
path.lineTo(0.5f, 1.3f);
path.lineTo(0.75f, 0.8f);
path.lineTo(1.0f, 1.0f);
PathInterpolator pathInterpolator = new PathInterpolator(path);
AnimatorSet set2 = new AnimatorSet();
set2.playTogether(scaleXBack, scaleYBack, translationZBack);
set2.setDuration(500);
set2.setInterpolator(pathInterpolator);
final AnimatorSet set = new AnimatorSet();
set.playSequentially(set1, set2);
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
set.start();
}
});
set.start();
}
The Problem
以上代码在 Lolipop 和更高版本的设备上运行良好,但在 KitKat 设备上运行不正常
Below are some links I have tried
- ObjectAnimator starting with a frame jump on Android 4.4 (nexus 5) but not in 4.1 device
- Implementing ImageView transition between activities for pre-Lollipop devices.
- Material Transitions in pre lollipop apps
- Android ImageView Zoom-in and Zoom-out Continuously
任何人都可以帮助解决 KitKat 设备中的问题
如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。
您看到以下代码行的 "Field requires API 21" Studio lint 错误,当 运行 在 Lollipop 上应用程序中止时。
ObjectAnimator translationZ = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, from, to);
ObjectAnimator translationZBack = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, to, from);
PathInterpolator pathInterpolator = new PathInterpolator(path);
如您所知,这些功能是在 API 21 中引入的,早期的 API 不可用,这就是您看到这些错误的原因。但是,您可以使用 PathInterpolatorCompat.
从支持库中获取路径插值器
Helper for creating path-based [Interpolator](https://developer.android.com/reference/android/view/animation/Interpolator.html)
instances. On API 21 or newer, the platform implementation will be used and on older platforms a compatible alternative implementation will be used.
我认为您不需要 "z" 翻译的解决方案。 (我真的看不出拥有和不拥有有什么区别,但这可能只是我。无论如何,FAB 已经有了身高效应的阴影。)
这里是 animFab()
的返工,有一些更改以适应 21 之前的 API。
确保从 v4 支持库中获取 PathInterpolatorCompat
。 首先是一个显示在 API 19 模拟器上运行的代码的视频:
public void animFab() {
ObjectAnimator scaleX = ObjectAnimator.ofFloat(fab, View.SCALE_X, from, to);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(fab, View.SCALE_Y, from, to);
AnimatorSet set1 = new AnimatorSet();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ObjectAnimator translationZ = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, from, to);
set1.playTogether(scaleX, scaleY, translationZ);
} else {
set1.playTogether(scaleX, scaleY);
}
set1.setDuration(500);
set1.setInterpolator(new AccelerateInterpolator());
set1.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
Path path = new Path();
path.moveTo(0.0f, 0.0f);
path.lineTo(0.5f, 1.3f);
path.lineTo(0.75f, 0.8f);
path.lineTo(1.0f, 1.0f);
Interpolator pathInterpolator = PathInterpolatorCompat.create(path);
AnimatorSet set2 = new AnimatorSet();
ObjectAnimator scaleXBack = ObjectAnimator.ofFloat(fab, View.SCALE_X, to, from);
ObjectAnimator scaleYBack = ObjectAnimator.ofFloat(fab, View.SCALE_Y, to, from);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ObjectAnimator translationZBack = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, to, from);
set2.playTogether(scaleXBack, scaleYBack, translationZBack);
} else {
set2.playTogether(scaleXBack, scaleYBack);
}
set2.setDuration(500);
set2.setInterpolator(pathInterpolator);
final AnimatorSet set = new AnimatorSet();
set.playSequentially(set1, set2);
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
set.start();
}
});
set.start();
}
另一种可能性是对可绘制动画使用 AnimatedVectorDrawableCompat,但那将是一个完整的重写。
我想在 FloatingActionButton
我试过的
public void animFab() {
ObjectAnimator scaleX = ObjectAnimator.ofFloat(fab, View.SCALE_X, from, to);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(fab, View.SCALE_Y, from, to);
ObjectAnimator translationZ = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, from, to);
AnimatorSet set1 = new AnimatorSet();
set1.playTogether(scaleX, scaleY, translationZ);
set1.setDuration(500);
set1.setInterpolator(new AccelerateInterpolator());
set1.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
ObjectAnimator scaleXBack = ObjectAnimator.ofFloat(fab, View.SCALE_X, to, from);
ObjectAnimator scaleYBack = ObjectAnimator.ofFloat(fab, View.SCALE_Y, to, from);
ObjectAnimator translationZBack = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, to, from);
Path path = new Path();
path.moveTo(0.0f, 0.0f);
path.lineTo(0.5f, 1.3f);
path.lineTo(0.75f, 0.8f);
path.lineTo(1.0f, 1.0f);
PathInterpolator pathInterpolator = new PathInterpolator(path);
AnimatorSet set2 = new AnimatorSet();
set2.playTogether(scaleXBack, scaleYBack, translationZBack);
set2.setDuration(500);
set2.setInterpolator(pathInterpolator);
final AnimatorSet set = new AnimatorSet();
set.playSequentially(set1, set2);
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
set.start();
}
});
set.start();
}
The Problem
以上代码在 Lolipop 和更高版本的设备上运行良好,但在 KitKat 设备上运行不正常
Below are some links I have tried
- ObjectAnimator starting with a frame jump on Android 4.4 (nexus 5) but not in 4.1 device
- Implementing ImageView transition between activities for pre-Lollipop devices.
- Material Transitions in pre lollipop apps
- Android ImageView Zoom-in and Zoom-out Continuously
任何人都可以帮助解决 KitKat 设备中的问题
如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。
您看到以下代码行的 "Field requires API 21" Studio lint 错误,当 运行 在 Lollipop 上应用程序中止时。
ObjectAnimator translationZ = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, from, to);
ObjectAnimator translationZBack = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, to, from);
PathInterpolator pathInterpolator = new PathInterpolator(path);
如您所知,这些功能是在 API 21 中引入的,早期的 API 不可用,这就是您看到这些错误的原因。但是,您可以使用 PathInterpolatorCompat.
从支持库中获取路径插值器Helper for creating path-based
[Interpolator](https://developer.android.com/reference/android/view/animation/Interpolator.html)
instances. On API 21 or newer, the platform implementation will be used and on older platforms a compatible alternative implementation will be used.
我认为您不需要 "z" 翻译的解决方案。 (我真的看不出拥有和不拥有有什么区别,但这可能只是我。无论如何,FAB 已经有了身高效应的阴影。)
这里是 animFab()
的返工,有一些更改以适应 21 之前的 API。
确保从 v4 支持库中获取 PathInterpolatorCompat
。 首先是一个显示在 API 19 模拟器上运行的代码的视频:
public void animFab() {
ObjectAnimator scaleX = ObjectAnimator.ofFloat(fab, View.SCALE_X, from, to);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(fab, View.SCALE_Y, from, to);
AnimatorSet set1 = new AnimatorSet();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ObjectAnimator translationZ = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, from, to);
set1.playTogether(scaleX, scaleY, translationZ);
} else {
set1.playTogether(scaleX, scaleY);
}
set1.setDuration(500);
set1.setInterpolator(new AccelerateInterpolator());
set1.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
Path path = new Path();
path.moveTo(0.0f, 0.0f);
path.lineTo(0.5f, 1.3f);
path.lineTo(0.75f, 0.8f);
path.lineTo(1.0f, 1.0f);
Interpolator pathInterpolator = PathInterpolatorCompat.create(path);
AnimatorSet set2 = new AnimatorSet();
ObjectAnimator scaleXBack = ObjectAnimator.ofFloat(fab, View.SCALE_X, to, from);
ObjectAnimator scaleYBack = ObjectAnimator.ofFloat(fab, View.SCALE_Y, to, from);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ObjectAnimator translationZBack = ObjectAnimator.ofFloat(fab, View.TRANSLATION_Z, to, from);
set2.playTogether(scaleXBack, scaleYBack, translationZBack);
} else {
set2.playTogether(scaleXBack, scaleYBack);
}
set2.setDuration(500);
set2.setInterpolator(pathInterpolator);
final AnimatorSet set = new AnimatorSet();
set.playSequentially(set1, set2);
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
set.start();
}
});
set.start();
}
另一种可能性是对可绘制动画使用 AnimatedVectorDrawableCompat,但那将是一个完整的重写。