如何连续制作Fab按钮的动画(放大/缩小)?

时间:2018-12-02 06:00:54

标签: java android android-layout android-animation floating-action-button

我想在FloatingActionButton上创建这种动画

enter image description here

我尝试过的

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();


}
  

问题

以上代码在Lolipop及以上设备上正常运行,但在KitKat设备上不工作

  

下面是我尝试过的一些链接

任何人都可以帮助解决KitKat设备中的问题

如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。

1 个答案:

答案 0 :(得分:2)

对于在Lollipop上运行的应用,以下代码行会看到“字段需要API 21” Studio Lint错误。

df <- read.table(text =
    "m_id winner_id winner_height
    1         21    166
    2         21    166
    3         22    167
    4         21    166
    5         23    170
    6         24    163
    7         22    167
    8         25    164", header = T)

如您所知,这些功能是在API 21中引入的,不适用于早期的API,这就是为什么您会看到这些错误。但是,您可以使用PathInterpolatorCompat从支持库中获取路径插值器。

  

用于创建基于路径的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或更高版本上,将使用平台实现,而在较旧平台上,将使用兼容的替代实现。

我认为您不需要“ z”翻译的解决方案。 (我真的看不到它与没有它之间的任何区别,但是那可能只是我。无论如何,FAB已经对高度效果产生了阴影。)

这里是[Interpolator](https://developer.android.com/reference/android/view/animation/Interpolator.html)的重做,并作了一些更改以适应21之前的API。 确保从v4支持库中获取animFab()首先是一段视频,显示在API 19仿真器上工作的代码:

enter image description here

PathInterpolatorCompat

另一种可能性是对可绘制的动画使用AnimatedVectorDrawableCompat,但这将是一个完整的重写。