我是Android Studio的新手,我想同时在多个坐标上为多个图像设置动画。
假设我想将图像A从0/0移至100/100,然后移至200/200;同时(例如,通过单击按钮),图像B应从0/100移至100/100,然后移至200/100。全部都是简单的翻译。
(此外,我希望能够独立设置运动的持续时间。)
动画制作完成后,应该有一个事件(如OnAnimationFinish之类的东西)触发其他事件,例如再次启用开始按钮。
最有效的方法是什么?我知道Android中有一个AnimationSet可以存储多个动画,但是我不知道这在这里是否有用。
谢谢!
答案 0 :(得分:1)
您可以将ObjectAnimator
与AnimatorSet
结合使用,以同时通过适当的侦听器播放多个动画。
例如():
val imageXAnimator = ObjectAnimator.ofFloat(imageView, "translationX", translateX)
val imageYAnimator = ObjectAnimator.ofFloat(imageView, "translationY", translateY)
val imageAlphaAnimator = ObjectAnimator.ofFloat(imageView, "alpha", if (reverse) 0F else 1F)
val animationSet = AnimatorSet()
animationSet.playTogether(
imageXAnimator,
imageYAnimator,
imageAlphaAnimator)
animationSet.interpolator = DecelerateInterpolator()
animationSet.duration = 1000
animationSet.addListener(
onStart = {
//When animation is started
},
onEnd = {
//When animation finishes
}
)
animationSet.start()
或者是kotlin
中的一个简单扩展名,可以在特定的View
上调用:
inline fun View.animateTranslationY(translationY: Float, duration: Long = 1000, startDelay: Long = 0) {
val translationYAnimator = ObjectAnimator.ofFloat(this, "translationY", translationY)
translationYAnimator.duration = duration
translationYAnimator.startDelay = startDelay
translationYAnimator.interpolator = LinearInterpolator()
translationYAnimator.addAnimatorListener(
onStart = { },
onEnd = { }
)
translationYAnimator.start()
}
答案 1 :(得分:0)
您可以使用“ View.animate()”方法来访问其子方法和事件,以管理所有这些内容。您只需在视图(TextView,ImageView,EditBox等)上调用“ animate()”,然后调用其子方法来确定要执行哪种动画:运动,旋转,更改透明度等。 。对于每个动画,您可以设置一个监听器,该监听器将在动画的开始和/或结束处调用。
答案 2 :(得分:0)
为两个视图都考虑这两种方法
private void animateFirstView(final ImageView first, long durationFirst, final long durationSecond) {
first.setTranslationX(0);
first.setTranslationY(0);
first.animate().translationX(100).translationY(100).setDuration(durationFirst).setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
first.animate().translationY(200).translationX(200).setDuration(durationSecond).setListener(null).setInterpolator(new LinearInterpolator()).start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).setInterpolator(new LinearInterpolator()).start();
}
private void animateSecondView(final ImageView second, long durationFirst, final long durationSecond) {
second.setTranslationX(0);
second.setTranslationY(100);
second.animate().translationX(100).translationY(100).setDuration(durationFirst).setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
second.animate().translationY(200).translationX(100).setDuration(durationSecond).setListener(null).setInterpolator(new LinearInterpolator()).start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).setInterpolator(new LinearInterpolator()).start();
}
答案 3 :(得分:0)
您可以这样做 :
private void playAnimation(final View view, final int endRangeY) {
view.animate().translationY(endRangeY) //endRangeY where you want to end the animation
.alpha(0.0f)
.setDuration(3000)
.setListener(new AnimatorListenerAdapter() {
@Override public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
}