1

我最近一直在环顾四周,以便在动画期间单击图像时动态设置 ImageView 的 x 和 y 位置,并且出现不足。我的 ImageView 以 XML 开头,并具有使 ImageView 落到屏幕底部的动画。

当用户单击它时,我希望 ImageView 现在转到布局的最顶部(屏幕顶部),然后我可以随机选择 x 位置。基本上这样它就可以保持从相同的位置开始并落向屏幕底部。如果用户单击 ImageView 然后它会回到顶部,这样动画就可以再次发生。

我有这样的动画:

ViewPropertyAnimator viewPropertyAnimator = myImageView.animate()
     .translationY(bottomOfScreen)
     .setInterpolator(new AccelerateInterpolator())
     .setInterpolator(new BounceInterpolator())
     .setDuration(1000);

我在 myImageView 的 onClickListener 中有一个这样的 x 和 y:

myImageView.setOnClickListener(new View.OnClickListener() {
    Random randomX = new Random();
    myImageView.setX(randomX.nextInt(500 - 0 + 1) + 0);
    myImageView.setY(-300);
}

x 似乎可以将 ImageView 放置在我想要的 x 上的任何位置。然而,当您单击 ImageView 时,似乎由于动画发生(将 ImageView 放到布局的底部),y 始终设置为单击它的位置。

4

1 回答 1

0

首先,有些事情在您的代码中没有意义。这一行:

myImageView.setX(randomX.nextInt(500 - 0 + 1) + 0);

令人困惑,可以简化为

 myImageView.setX(randomX.nextInt(500 + 1));

而这一行:

myImageView.setY(-300);

表示您将 y 轴的 ImageView -300 放置在屏幕外。请记住,y = 0 是屏幕的顶部。当你只是 setX 和 setY 时,它看起来也不酷。视图消失并在其他地方弹出。你为什么不尝试这样的事情:

myImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Random randomX = new Random();

            myImageView.animate()
                    .translationX(randomX.nextInt(500 + 1))
                    .translationY(myImageView.getHeight())
                    .setInterpolator(new AccelerateDecelerateInterpolator())
                    .setDuration(500)
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                            myImageView.animate()
                                    .translationY(bottomOfScreen)
                                    .setInterpolator(new AccelerateInterpolator())
                                    .setInterpolator(new BounceInterpolator())
                                    .setDuration(1000);
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {

                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {

                        }
                    });
        }
    });

这会将 View 动画化回顶部并等待动画通过 AnimatorListener 完成,然后在调用 onAnimationEnd() 时让它再次下降。

于 2016-01-26T08:52:26.787 回答