Android 单击使用动画的 ImageView 时动态重置 ImageView 位置
Android Reset ImageView Location dynamically When Clicking on ImageView that uses Animation
我最近一直在四处寻找,以便在动画期间单击图像时动态设置 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 始终设置为单击它的位置。
首先,有些东西在您的代码中没有意义。
这一行:
myImageView.setX(randomX.nextInt(500 - 0 + 1) + 0);
令人困惑,可以简化为
myImageView.setX(randomX.nextInt(500 + 1));
还有这一行:
myImageView.setY(-300);
表示你放置的是y轴-300的ImageView,它在屏幕外。请记住 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() 时让它再次下降。
我最近一直在四处寻找,以便在动画期间单击图像时动态设置 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 始终设置为单击它的位置。
首先,有些东西在您的代码中没有意义。 这一行:
myImageView.setX(randomX.nextInt(500 - 0 + 1) + 0);
令人困惑,可以简化为
myImageView.setX(randomX.nextInt(500 + 1));
还有这一行:
myImageView.setY(-300);
表示你放置的是y轴-300的ImageView,它在屏幕外。请记住 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() 时让它再次下降。