当前位置: 首页 > 面试题库 >

单击动画Fab(放大/缩小)

张和颂
2023-03-14
问题内容

我正在尝试模仿动画和以下浮动操作按钮的颜色更改。

浮动操作按钮的工作方式是关闭白色,打开蓝色。

但是,我在动画和更改颜色方面一直不成功。

这些是我尝试执行此操作的尝试,您可以看到我已经注释掉了我尝试执行此操作的所有不同方式。

这是我的代码:

    @SuppressWarnings("unused")
    @OnClick(R.id.fabMovieFavourite)
    public void addMovieFavourite(View view) {
 /*       final Animator animator = AnimatorInflater.loadAnimator(getActivity(), R.animator.add_favourite_movie);
        animator.setTarget(view);)
        animator.start();
 */
/*
        AnimatorSet animatorSet = new AnimatorSet();
        PropertyValuesHolder propertyValuesHolderX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1.1f);
        PropertyValuesHolder propertyValuesHolderY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1.1f);
        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(view, propertyValuesHolderX, propertyValuesHolderY);
        objectAnimator.setDuration(300);
        objectAnimator.setInterpolator(new OvershootInterpolator(10f));
*/

        /*
        objectAnimator.setRepeatCount(1);
        objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
*/

/*
        PropertyValuesHolder propertyValuesHolderX2 = PropertyValuesHolder.ofFloat(View.SCALE_X, 0.9f);
        PropertyValuesHolder propertyValuesHolderY2 = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0.9f);
        ObjectAnimator objectAnimator2 = ObjectAnimator.ofPropertyValuesHolder(view, propertyValuesHolderX2, propertyValuesHolderY2);
        objectAnimator.setDuration(300);
        objectAnimator2.setInterpolator(new OvershootInterpolator(10f));

        animatorSet.playSequentially(objectAnimator, objectAnimator2);
        objectAnimator.start();
*/

      //  view.BackgroundTintList(ContextCompat.getColorStateList(getContext(), R.color.primary));
        //view.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.primary));

        if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            Timber.d("start translationZ");
            ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Z, 12f);
            objectAnimator.setDuration(300);
            objectAnimator.setInterpolator(new OvershootInterpolator(10f));
            objectAnimator.setTarget(view);
            objectAnimator.start();
        }
    }

Many thanks for any suggestions.


问题答案:

此动画有两个阶段。第一个缩放X和Y轴,第二个缩小它。因此,我们可以将它们分为两个AnimatorSet并顺序播放。

动画的关键点是为第二个像素找到合适的插值器AnimatorSet,因为它不是标准的插值器。

看,我们希望晶圆厂超调,然后下冲,然后最终稳定到动画制作器中的指定值。

幸运的是,它非常方便PathInterpolator,它会为provider提供一个内插器Path

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

So, let’s create the first animation:

final float from = 1.0f;
final float to = 1.3f;

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(100);
set1.setInterpolator(new AccelerateInterpolator());

set1.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        fab.setImageResource(isActive ? R.drawable.heart_active : R.drawable.heart_passive);
        fab.setBackgroundTintList(ColorStateList.valueOf(isActive ? colorActive : colorPassive));
        isActive = !isActive;
    }
});

我们同时缩放x,y。另外,我们正在更改z平移以具有适当的阴影效果。动画结束时,我们要更改fab状态(心脏和fab背景的颜色)。

现在,让我们创建动画来解决:

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

AnimatorSet set2 = new AnimatorSet();
set2.playTogether(scaleXBack, scaleYBack, translationZBack);
set2.setDuration(300);
set2.setInterpolator(pathInterpolator);

看到这里,我们使用pathInterpolator了我们先前创建的。

我们想要AnimatorSet依次播放这两个:

final AnimatorSet set = new AnimatorSet();
set.playSequentially(set1, set2);

set.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        fab.setClickable(true);
    }

    @Override
    public void onAnimationStart(Animator animation) {
        fab.setClickable(false);
    }
});

另外,我们希望在制作动画时禁用对fab的点击。所以我们根据动画状态打开/关闭它。

最后,当发生点击时,我们启动动画:

fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        set.start();
    }
});

Source code at github



 类似资料:
  • 本文向大家介绍js实现双击图片放大单击缩小的方法,包括了js实现双击图片放大单击缩小的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现双击图片放大单击缩小的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我正在用Java编写一个数独游戏,我想把新游戏的动作制作成动画,如下所示: 一旦用户点击开始游戏,每个元素就开始从左上角到右下角依次出现。 动画应该以彼此100毫秒的延迟开始,而不是同时进行。比如从60%到100%,然后完成每个元素的动画。 我将谜题模型加载到JPanel中的代码是: puzzle对象的数字从1到300,对应于图像,所以在创建ImageButtonMyImages时使用它。“thi

  • 官方缩放视图教程使用缩放到。它会随着视图的扩展而产生向下移动的错觉。稍后,只需向后重播即可产生缩小的错觉。 以下是我目前为止尝试过的。我的XML布局是 这是执行缩小操作的方法。我基本上试着颠倒了教程中的过程: 我在中调用此方法,如下所示: 好了,就是这样,伙计们。它不起作用。我不知道为什么。演示示例运行完美,那么为什么这个不起作用呢?看看,告诉我我是否疯了。 有人能识别错误吗?或者给我指出正确的方

  • 由于一段时间内突发的高流量,我们经历了节流(429)。为了缓解这个问题,我们目前增加了azure portal中的RU,并在以后降低它。 我想根据指标向上/向下扩展,但是,它不会公开为文档数据库容器创建的物理分区数。 如何获取文档数据库容器的物理分区数 如果这个组中有人解决了自动缩放问题,我很想知道如何解决

  • 我的出发点如下: FXML: Java FX控制器:

  • 我正在做自己的画布抽屉项目,只是停留在放大/缩小功能上。在我的项目中,我使用缩放和平移来进行缩放,因为我想将所有画布及其元素保持在中心。在画了一点草图(不是数学天才)之后,我成功地画出了下面的公式用于翻译过程,因此缩放后画布将保持在它的视口的中间:旧的宽度和高度/ 2 -新的宽度和高度(这是旧的宽度和高度乘以比例步长,在我的例子中是1.1)/2。从逻辑上讲,这应该行得通。但是在尝试了几次放大和缩小